2009-07-28 6 views
33

최근에 ASP.NET MVC 및 Javascript/jQuery로 많은 작업을 해왔고 항상 통과해야하는 방향으로 가고 있습니다. 몇 가지 동적 인 가치 "내"자바 스크립트. 스크립트가 오른쪽 페이지에있는 경우,이 같은 짓을했습니다asp.net-mvc에서 javascript로 데이터를 전달하는 모범 사례

var isEditable = <%=ViewData["editable"]%> 

내가이 & 쉽고 빠르게 그냥 HTML에 값을 삽입 할 것 같다 방법을 좋아한다. 그러나이 냄새. 정말로, 정말로 나쁨. Visual Studio의 IntelliSense 및 코드 형식이 깨져서 스크립트를 읽고 이해하기가 어려워집니다.

그것은 다른 해결책이 그대로 스크립트를 유지으로이 아마 훨씬 더

<input type="hidden" id="editable" value="<%=ViewData["editable"]%>" /> 
var isEditable = $("#editable").attr("value"); 

... 숨겨진 필드에 내 데이터를 전달하고, 그 자바 스크립트 참조가하는 것 나에게 발생하여 그것을 외부 .js 파일로 옮길 수 있습니다. 그러나이 솔루션에 대한 어떤 것도 이상적인 것으로 보이지 않습니다. 아니면 그냥 나야?

누구나 해결책을 추천 할 수 있습니까? & 스크립트에 데이터를 전달하는 모범 사례가 있습니까? 스크립트가 처음으로 내 컨트롤러의 viewdata에 많이 의존하게되면 잘못된 경로로 향하고 있습니까?

+1

AJAX를 사용하여 컨트롤러에서 모델의 데이터 저장소로 데이터를 "가져 오는"방법은 무엇입니까? – Janie

+1

AJAX는 내가 언급하고있는 유형의 과도기라고 생각합니다 ... 대개 내 스크립트는 컨트롤러/모델 (초기 페이지 실행시 이미 존재하는 데이터)에서 몇 비트의 데이터 만 알아야하므로 다른 네트워크 콜을 발행하는 것은 컨트롤러가 조금은 비슷해 보입니다. –

답변

11

나는 때때로 JSON 시리얼 라이저를 통해 페이지에 구성 객체를 작성하여 내 페이지에 데이터를 전달 : 당신이 ToJson 방법을 직접 작성할 필요가

var pageConfig = <%= ServerConfig.ToJson() %>; 

. 이렇게하면 페이지 상태가 잘 보관되므로 서버 값을 삽입 할 수있는 위치가 하나만 있습니다. 여기에서 모든 것은 순수한 자바 스크립트입니다. 당신의 예에서, 당신은 할 수 :

var isEditable = pageConfig.isEditable; 

도 외부 JS 파일, 경우 pageConfig 글로벌입니다. 이 경우에는 네임 스페이스를 올바르게 지정해야합니다 (예 : MY_APP.pageConfig).

+0

이것은 chacheability에 영향을 미치지 않습니까?적어도 각 페이지 GET은 다른 페이지를 반환 할 수 있습니다 (다른 구성). 프록시 서버의 캐시 측면에서 생각할 때, 이제 각 사용자마다 다른 버전의 페이지를 갖게됩니다. 그게 전혀 문제 야? –

+0

이것은 흥미로운 옵션이지만이 ServerConfig 클래스를 구현하는 방법을 정확히 이해하고 있는지 확신 할 수 없습니다. 실제로 각 페이지 GET은 다른 데이터 집합을 반환 할 수 있으므로 궁극적으로 각 페이지의 ViewData에서 pageConfig를 설정해야합니까? 그럼에도 불구하고, 당신의 다른 제안은 분명히 (Json과 글로벌 js 변수) 시도 할 것입니다 - 고마워요! –

+0

@Kurt - 네, 아마도 익명 형식으로 ViewData에서 빌드해야 할 것 같습니다. ViewData를 제거 할 수는 없지만 서버 데이터를 페이지에 삽입하는 위치의 수를 제한 할 수는 있습니다. –

0

당신은 그 정보를 어떤 방식 으로든 주입하려고합니다. 그리고 IMO, 첫 번째 예제는 두 번째 예제와 실제로 다르지 않습니다.

다른 해결책은 옵션 개체를 허용 할 JS 클래스 (또는 프로토 타입?)를 갖는 것입니다. 비록 시피하지만, 당신이 준 예제와 정말로 다르지 않습니다. 하지만 여전히, 당신은이 길로 가고 싶을 것입니다.

$(function() { 
    myClass.init({ isEditable: <%=ViewData["editable"]%>, 
     another: '<%=ViewData["another"]%>' }); 
}); 
0

나는 @ çağdaş가 좋은 지적이지만, 서버 측도 점검해야한다는 것을 기억하십시오. 필드를 "읽기 전용"으로 설정하면 사용자가 해당 플래그를 수정하거나, 읽기 전용 필드를 변경하거나, 제출하지 못하게 할 수 없습니다.

0

Ajax 전체 사업은 로드 정보를 비동기 적으로 처리합니다. Ajax의 일을하고 있다면 (정보를 로딩하고 변수에 보관하는 것), 그것은 힘을 빼앗아갑니다. JQuery를 사용하고 Ajax를 사용하거나 Get 함수를 사용하여 컨텐츠를 동적으로로드하지 않는 것이 좋습니다. 그것은 당신의 페이지를 더 빨리로드하는 데 도움이됩니다.

관련 문제