2012-01-07 2 views
4

i를가 jqueryui 대화 상자를 엽니 다 JQuery와 스크립트의 일부로 다음 코드 (ID 값이 하드 코딩 된 테스트 용입니다)이 있습니다이스케이프 문자

 open: function (event, ui) { 

      $(this).load("@Url.Action("Edit", "Person", 
       new 
       { 
        id = Guid.Parse("28769371-7518-49db-a5ea-b9c62621a609"), 
        selectedPersonFor = Model.SelectedPersonFor, 
        selectedPersonForId = Model.SelectedPersonForId, 
        clientAccountId = Model.ClientAccountId 
       })"); 
     }, 

문제는 대화 상자가 열리더라도 컨트롤러 작업이 절대로 실행되지 않는다는 것입니다. 내 브라우저에서 소스를 볼 경우

생성되는 출력은 다음과 같습니다

open: function (event, ui) { 

      $(this).load("/Person/Edit/28769371-7518-49db-a5ea-b9c62621a609?selectedPersonFor=ClientAccount&selectedPersonForId=2a2dd3b9-a73b-4afa-8237-5a4f37736f8a&clientAccountId=00000000-0000-0000-0000-000000000000"); 
     }, 

내가 발견 한 그 내 스크립트에 위의 URI를 하드와 비 탈출로 탈출 앰퍼샌드 (&)을 대체하는 경우 앰퍼샌드 (&) 내 컨트롤러 작업에 충돌합니다.

이스케이프 처리 된 앰퍼샌드를 없애기 위해 스크립트에서 replace 메서드 호출을 추가하려고 시도했지만 도움이되지 않습니다. 을 호출하지만 스크립트 내에서 호출되지 않은 동일한 URI 페이지 내에서 다른 URI를 볼 때, 나는 그 안에서 앰퍼샌드를 이스케이프 처리했음을 알았습니다.

브라우저에서 컨트롤러 동작에 대한 호출을 스크립트에서 처리하는 방법이 스크립트 외부에서 수행하는 방법과 이스케이프 된 앰퍼샌드와 관련된 모든 점에서 차이가있는 것으로 보입니다.

누군가이 문제를 극복하는 방법을 안내해 줄 수 있습니까?

추가 정보 : 나는 또한 다음과 같이로드 기능에 쿼리 매개 변수를 전달하는 시도

: 나는이 방법을 수행 할 때

open: function (event, ui) { 

      $(this).load("@Url.Action("Edit", "Person")", 
       { 
        id: @Guid.Parse("28769371-7518-49db-a5ea-b9c62621a609"), 
        selectedPersonFor: Model.SelectedPersonFor, 
        selectedPersonForId: Model.SelectedPersonForId, 
        clientAccountId: Model.ClientAccountId 
       }); 
     }, 

그러나 내 대화조차 열리지 않습니다.

편집 : 응답에서

내가 제공하는 경로를 보여 요청에 (희망이 요청되고 있던 것입니다) 다음 : 난 그냥 기본 경로를 사용하고

routes.MapRoute(
      "Default", // Route name 
      "{controller}/{action}/{id}", // URL with parameters 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
     ); 

내 ASP를 제공 .net mvc3 프로젝트.

+0

경로를 표시하면 답변하기가 더 쉬울 것입니다. –

답변

6

면도기 @ 연산자는 HTML 인코딩에 사용됩니다. 출력 =>&&이됩니다. 당신이 렌더링 된 HTML을 보면

$(this).load("@Url.Action("Edit", "Person")", { 
    id: @Guid.Parse("28769371-7518-49db-a5ea-b9c62621a609"), 
    selectedPersonFor: Model.SelectedPersonFor, 
    selectedPersonForId: Model.SelectedPersonForId, 
    clientAccountId: Model.ClientAccountId 
}); 

는이 표시됩니다의이 두 번째 코드를 살펴 보자 이제

var url = '@Html.Raw(Url.Action("Edit", "Person", new { 
    id = Guid.Parse("28769371-7518-49db-a5ea-b9c62621a609"), 
    selectedPersonFor = Model.SelectedPersonFor, 
    selectedPersonForId = Model.SelectedPersonForId, 
    clientAccountId = Model.ClientAccountId 
}))'; 
$(this).load(url); 

: 당신이하지 않으려면이 당신이 Html.Raw 도우미를 사용할 수 발생합니다 : Model.SelectedPersonForId 아마 당신은 자바 스크립트 오류가되도록 자바 스크립트 변수 유효하지 않기 때문에 분명히 작동하지 않습니다

$(this).load("@Url.Action("Edit", "Person")", { 
    id: 28769371-7518-49db-a5ea-b9c62621a609, 
    selectedPersonFor: Model.SelectedPersonFor, 
    selectedPersonForId: Model.SelectedPersonForId, 
    clientAccountId: Model.ClientAccountId 
}); 

. 또한 28769371-7518-49db-a5ea-b9c62621a609은 따옴표로 묶지 않은 유효한 자바 스크립트 표현식이 아닙니다.

이 당신이 적절한 내용을 생성 확인 작업 할 경우

$(this).load("/Person/Edit", { 
    id: '@Guid.Parse("28769371-7518-49db-a5ea-b9c62621a609")', 
    selectedPersonFor: '@Model.SelectedPersonFor', 
    selectedPersonForId: '@Model.SelectedPersonForId', 
    clientAccountId: '@Model.ClientAccountId' 
}); 

공지 사항 각 서버 측 변수를 이전에 사용하고 가이 드의 앞에뿐만 아니라 @ 연산자. 또한 값이 자바 스크립트 문자열로 래핑되는 것을 볼 수 있습니다.

+0

제 2 코드 스 니펫의 문제점을 지적 해 주셔서 감사합니다. 귀하가 제안한 변경 사항을 적용했지만 대화 상자가 표시되지만 컨트롤러 동작에 영향을주지 않습니다. – daveywc

+0

@daveywc, 생성 된 마크 업은 무엇입니까? 컨트롤러가 작동하지 않는 이유는 무엇입니까? FireBug 콘솔에서 무엇을 볼 수 있습니까? AJAX 요청 중에 컨트롤러에 무엇이 전송됩니까? 서버는 무엇을 응답합니까? –

+0

생성 된 마크 업입니다 : $ (이) .load ("/ 사람/편집" { ID : '28769371-7518-49db-a5ea-b9c62621a609', selectedPersonFor 'ClientAccount', selectedPersonForId : '2a2dd3b9- a73b-4afa-8237-5a4f37736f8a ', clientAccountId :'00000000-0000-0000-0000-000000000000 ' }); – daveywc