2014-10-08 4 views
0

보기에서, 사용자는 선택 이름 후 ... 표시되는 내용에서C#을 컨트롤러 매개 변수와 함께 @ HTML.Action를 사용하면

<form name=chkAttend method=post onsubmit='return validate(this)'>     
<div> 
    @if (Model.evModel.Participants != null) 
    { 
     foreach (var fi in Model.evModel.Participants) 
     { 
      <div> 
       @if (@fi.AttendedFlag != true) 
       { 
        <input type="checkbox" id="[email protected]" name="MyCheckboxes" value="@fi.EnrollmentId" /> 
         <label for="[email protected]" aria-multiselectable="True"></label> 
    <span></span> @fi.EnrollmentId @fi.ParticipantName                     
       } 
      </div> 
     } 
    } 
    <input type=submit value="Confirm Attendance"> 
    </div> 
</form> 

을 1 개 이상 이름을 확인 이름을 확인하는 확인하기 위해 함수를 호출합니다. 점검 된 이름은 컨트롤러로 전달되어야합니다. 문제 - 나는 오류 메시지를 받고 있어요 : 오류 49 이름 'ID는'현재 컨텍스트

 function validate(form) { 
      var id = "" 
      for (var i = 0; i < document.chkAttend.MyCheckboxes.length; i++) 
      { 
       if (document.chkAttend.MyCheckboxes[i].checked) 
       id += document.chkAttend.MyCheckboxes[i].value + "," 
      } 
      if (id == "") 
      { 
       alert("Place a check mark next to event's Participant") 
      } 
      else 
      { 
      @Html.Action("ConfirmAttendance", "Admin", new { eventid = @Model.evModel.Id, enrollid =id }) 
     } 
      return false; 
     } 

에 존재하지 않습니다 어떻게 내 컨트롤러에서 함수에 대한 매개 변수 만 검사 항목을 통과합니까?

+0

서버 측 코드 ('@ Html.Action ...')를 클라이언트 측 코드에 드롭 할 수는 없습니다. 그것은 결코 작동하지 않을 것입니다. 뷰가 반환되기 전에 서버에서 실행되는 Razor와 브라우저에서 실행되는 Javascript 간의 차이점을 알아야합니다. 'id' 변수는 폼이 제출 될 때 실행되는 Javascript에서 생성되기 훨씬 전에 C# 코드가 페이지로드 전에 서버에서 실행되기 때문에'id'는 현재 컨텍스트에 존재하지 않습니다. –

답변

0

코드에 서버 측 부분 뷰를 삽입 할 수 없습니다. 그대로 (id 변수 참조 문제가있는 경우) 문자 그대로 부분 뷰 인라인 을 자바 스크립트에 삽입하면 잘못된 자바 스크립트가 작성됩니다!

대신 JS를 클라이언트 측으로 취급하고 액세스하기 쉬운 방식으로 Javascript가 필요로하는 페이지에 정보를 입력하십시오. 주입 된 JS 코드를 통해 전역 변수를 주입 할 수는 있지만, 그 실행을 강력히 권장합니다.

하는 대신 MVC 페이지는 컨트롤러 액션 URL과 같은 data- 속성과 이벤트 ID 주입 수 : Url.Content이 URL을 보장하여

<form name="chkAttend" method="post" 
     data-action="@Url.Content("~/Admin/ConfirmAttendance")" 
     data-eventid="@Model.evModel.Id"> 

를 가상 응용 프로그램으로 호스팅하는 경우에도, 항상 사이트를 기준으로합니다.

다음 선택한 ID를 추가하고 사용하여 서버 액션을 호출, 양식에서 값을 선택할 수 있습니다 귀하의 클라이언트 측 코드 아약스 :

예를 들어,

function validate(form) { 
    var action = $(form).data('action'); 
    var eventId = $(form).data('eventid'); 

이제 클라이언트 측에서 서버를 호출해야하기 때문에 즐거움이 시작됩니다. Ajax를 통해 선택한 옵션으로 결과를 표시하여 화면을 변경하십시오.

 $.ajax({ 
      // Use constructed URL (action + event id + id) 
      url: action + "?eventid=" + eventId + "&enrollid=" + id, 
      type: "PUT" 
      success: function (data){ 
       // Do something with the server result 
      } 
    }); 

당신은 그래서 심지어 당신이 반환하는 것을 추측 할 수있는 컨트롤러의 ConfirmAttendance 조치를 표시하지 않습니다. 적합한지 확인하십시오 (부울 결과만큼 간단하거나 페이지에 삽입 할 부분보기만큼 복잡 할 수 있음).