2014-07-08 3 views
0

MVC 데모를 테스트하고 일부 조각을 함께 스크랩 할 수 있었지만 이제는 Html.ActionLink에 문제가 있습니다. 사용자가 ActionLink가 표시되기 전에 선택해야하는 일련의 드롭 다운 목록을 사용자에게 제공하려는 의도입니다. 그렇게하기 위해 일부 드롭 다운 목록 (선택 사항이 만들어진대로)과 ActionLink를 숨기거나 표시하기 위해 일부 JQuery를 복사했습니다. 내 JQuery에 값을 확인하라는 경고를 추가했으며 경고를 통해 모두 좋은 것처럼 보였다. 하지만 컨트롤러를 디버깅 할 경우 parm 값은 0으로 기본값이 설정됩니다. 포함 할 코드는 확실하지 않지만 관련 부분을 포함하려고합니다. 나는 그것이 뭔가 기본적인 것이라고 생각한다.MVC Html.ActionLink 매개 변수 값이 전달되지 않음

다음은 드롭 다운 목록과 ActionLink입니다.

@Html.DropDownListFor(m => m.selected_env_ID, new SelectList(Model.Environments, "env_ID", "env_DESC"), "*Select an environment") 
@Html.DropDownListFor(m => m.selected_app_ID, new SelectList(Model.Applications, "app_ID", "app_DESC"), "*Select an application",new { @hidden = "hidden" }) 
@Html.DropDownListFor(m => m.selected_job_ID, Enumerable.Empty<SelectListItem>(), "*Select a job", new { @hidden = "hidden" }) 
@Html.ActionLink("Submit", "Submit", new { id = Model.selected_job_ID, envid = Model.selected_env_ID }, new {id = "lnkSubmit" }) 

계단식 드롭 다운을 숨기거나 표시하고 채울 수있는 복잡한 JQuery가 있습니다.

<script> 
    $(document).ready(function() 
    { 
     //Dropdownlist Selectedchange event 
     $("#selected_app_ID").change(function() { 
      var id = $('#selected_app_ID').val(); // id value 
      if (id == 0) { 
       $('#selected_job_ID').hide(); 
      } else { 
       $('#selected_job_ID').show(); 
       $("#selected_job_ID").empty(); 
       $.ajax({ 
        type: 'POST', 
        url: '@Url.Action("SelectJobs")', 
        dataType: 'json', 
        data: { id: $("#selected_app_ID").val() }, 
        success: function (jobs) { 
         // jobs contains the JSON formatted list of jobs passed from the controller 
         $("#selected_job_ID").append('<option value=0>*Select a job</option>'); 
         $.each(jobs, function (i, job) { 
          $("#selected_job_ID").append('<option value="' 
           + job.job_ID + '">' 
           + job.job_DESC + '</option>'); 
         }); 
        }, 
        error: function (ex) { 
         alert('Failed to retrieve jobs.' + ex); 
        } 
       }); 
      } 
      return false; 
     }); 

     //ddl select change 
     $("#selected_env_ID").change(function() { 
      var name = $('#selected_env_ID option:selected').text(); //Item1 
      var id = $('#selected_env_ID').val(); // id value 
      if (id == 0) { 
       $('#divSubmit').hide(); 
       $('#selected_app_ID').hide(); 
       $('#selected_job_ID').hide(); 
      } else { 
       $('#selected_app_ID').show(); 
      } 
     }); 

     //ddl select change 
     $("#selected_job_ID").change(function() { 
      var name = $('#selected_job_ID option:selected').text(); //Item1 
      var id = $('#selected_job_ID').val(); // id value 
      var envid = $('#selected_env_ID').val(); // id value 
      if (id == 0) { 
       $('#divSubmit').hide(); 
      } else { 
       $('#divSubmit').show(); 
       alert("envid=" + envid + " jobid=" + id); 
      } 
     }); 


    }); // end document ready 

</script> 

내 컨트롤러는이와 ID를 가지고 공을 끝나게 envid :

public ActionResult Submit(int id = 0,int envid = 0) { 

를 그냥 알려 주시기 다른 뭔가를 포함해야합니다.

다음은 작업 드롭 다운 목록을 채우는 방법입니다. 이것은 문제없이 작동합니다. 매개 변수를 포함하지 못하는 Submit에 대한 Html.ActionLink 호출입니다.

public JsonResult SelectJobs(int id) 
{ 
    db.Configuration.ProxyCreationEnabled = false; 
    IEnumerable<t_job> jobs = db.t_job.Where(j => j.app_ID == id).ToList(); 
    return Json(jobs); 
} 

답변

0

귀하의 링크는 드롭 다운에서 어떤 선택을하기 전에

@Html.ActionLink("Submit", "Submit", new { id = Model.selected_job_ID, envid = Model.selected_env_ID }, new {id = "lnkSubmit" }) 

는 서버 측에서 렌더링됩니다. selected_job_IDselected_env_ID의 초기 값이 0 또는 null이면 해당 값이 컨트롤러에 전달됩니다 (렌더링 된 html을보십시오).

드롭 다운에서 선택한 값을 전달하려면 드롭 다운 변경 이벤트에서 링크 href 속성을 수정하거나 링크 대신 버튼을 만들고 버튼 클릭 이벤트에서 리디렉션을 수행 할 수 있습니다 드롭 다운 값을 기반으로합니다.

+0

정확합니다. 그게 문제라고 생각하고 있었지만 더 큰 그림을 보지 않고 개인적인 문제를 해결하기 위해 여러 가지 소스에서 코드를 가져 왔기 때문에 나는 그것을 깨닫지 못했습니다. 버튼과 스크립트를 사용할 수 있었지만 지금은 코드가 어디에 있는지 질문합니다. 계단식 드롭 다운 목록은 아마도 나를 잘못된 길로 가게했습니다. 페이지를 다시 실행하고 JQuery를 피하는 방법에 대해 다른 질문을 할 수도 있습니다. – pretzelb

0

당신은 JSON.stringify()를 사용해야합니다 :

data: JSON.stringify({ id: $("#selected_app_ID").val() }), 
+0

작업 목록을 채우는 컨트롤러 메서드를 포함하는 것을 잊었습니다. 실제로 stringify() 없이는 제대로 작동합니다. 여기에 SelectJobs (int id)를 추가하려고했지만 형식을 알 수 없습니다. 그것이 작동하고 드롭 다운리스트를 채우는 것으로 충분하다. 문제는 컨트롤러에서 Submit() 액션을 실행하려고 시도하는 Html.ActionLink입니다. 혼란을 드려 죄송합니다. – pretzelb

관련 문제