2012-05-16 2 views
0

POST 메서드를 사용하여 내 컨트롤러에서 이라고 표시된 데이터를 Create 액션으로 보내는 양식이 있습니다. 작업 서명은 Visit입니다. 문제는 뷰의 화면에 모든 속성이 채워지는 경우에도 Visit의 일부 속성 만 채워집니다. 데이터가 텍스트 상자에 입력되는 속성 만 채워집니다. 드롭 다운리스트의 어떤 값도 모델로 전달되지 않습니다.내 모델에 드롭 다운 목록에있는 속성이 채워지지 않는 이유는 무엇입니까?

여기에 어떤 아이디어가 있습니까? 감사!

MVC 4 베타.

업데이트 1 뷰에서 사용되는 형태로 ...

@using (Html.BeginForm()) 
{ 
    @Html.ValidationSummary(true) 

    <fieldset> 
     <legend>Visit</legend> 
      <div class="editor-label"> 
       @Html.LabelFor(model => model.Visit.VisitDate) 
      </div> 
      <div class="editor-field"> 
       @Html.TextBoxFor(model => model.Visit.VisitDate, new { @class = "editor-field-medium" }) 
       @Html.ValidationMessageFor(model => model.Visit.VisitDate) 
      </div> 
      <div class="editor-label"> 
       @Html.LabelFor(model => model.Visit.NPN) 
      </div> 
      <div class="editor-field"> 
       @Html.TextBoxFor(model => model.Visit.NPN, new { @class = "editor-field-medium" }) 
       @Html.ValidationMessageFor(model => model.Visit.NPN) 
      </div> 
      <div class="editor-label"> 
       @Html.LabelFor(model => model.Visit.AppointmentTypeId) 
      </div> 
      <div class="editor-field"> @* THIS DOES NOT GET POPULATED WHEN PASSED TO THE ACTION*@ 
       @Html.DropDownList("AppointmentTypeId", String.Empty) 
       @Html.ValidationMessageFor(model => model.Visit.AppointmentTypeId) 
      </div> 
      <div class="editor-label"> 
       @Html.LabelFor(model => model.Visit.EducationId) 
      </div> 
      <div class="editor-field"> @* THIS DOES NOT GET POPULATED WHEN PASSED TO THE ACTION*@ 
       @Html.DropDownList("EducationId", String.Empty) 
       @Html.ValidationMessageFor(model => model.Visit.EducationId) 
      </div> 
      <div class="editor-label"> 
       @Html.LabelFor(model => model.Visit.PsychologistId) 
      </div> 
      <div class="editor-field"> @* THIS DOES NOT GET POPULATED WHEN PASSED TO THE ACTION*@ 
       @Html.DropDownList("PsychologistId", String.Empty) 
       @Html.ValidationMessageFor(model => model.Visit.PsychologistId) 
      </div> 
      <div class="editor-label"> 
       @Html.LabelFor(model => model.Visit.PsychometristId) 
      </div> 
      <div class="editor-field"> @* THIS DOES NOT GET POPULATED WHEN PASSED TO THE ACTION*@ 
       @Html.DropDownList("PsychometristId", String.Empty) 
       @Html.ValidationMessageFor(model => model.Visit.PsychometristId) 
      </div> 
      <div class="editor-label"> 
       @Html.LabelFor(model => model.Visit.PostDoctoralId) 
      </div> 
      <div class="editor-field"> @* THIS DOES NOT GET POPULATED WHEN PASSED TO THE ACTION*@ 
       @Html.DropDownList("PostDoctoralId", String.Empty) 
       @Html.ValidationMessageFor(model => model.Visit.PostDoctoralId) 
      </div> 
      <div class="editor-label"> 
       @Html.LabelFor(model => model.Visit.BehavioralObservations) 
      </div> 
      <div class="editor-field"> 
       @Html.EditorFor(model => model.Visit.BehavioralObservations) 
       @Html.ValidationMessageFor(model => model.Visit.BehavioralObservations) 
      </div> 
     <p> 
      <input type="submit" value="Create Visit" /> 
     </p> 
    </fieldset> 
} 
+0

같은 것을 시도 ? 보기, 모델 및 컨트롤러 동작은 어떻게 생겼습니까? – nemesv

+0

모델/뷰 모델 및 뷰의 코드를 게시 할 수 있습니까? –

답변

1

귀하의 모델 상태는 아마도 유효하지 않습니다. 문제를 가진 작업의 첫 번째 줄에

public static class ModelExtensions 
{ 
    public static void DumpErrors(this System.Web.Mvc.ModelStateDictionary ModelState) 
    { 
     var errors = from key in ModelState 
        let errorList = ModelState[key.Key].Errors 
        where errorList.Any() 
        select new 
        { 
         Item = key.Key, 
         Value = key.Value, 
         errorList 
        }; 

     foreach (var errorList in errors) 
     { 
      System.Diagnostics.Debug.WriteLine("MODEL ERROR:"); 
      System.Diagnostics.Debug.WriteLine(errorList.Item); 
      System.Diagnostics.Debug.WriteLine(errorList.Value); 
      foreach (var error in errorList.errorList) 
      { 
       System.Diagnostics.Debug.WriteLine(error.ErrorMessage); 
       System.Diagnostics.Debug.WriteLine(error.Exception); 
      } 
      System.Diagnostics.Debug.WriteLine("-----"); 
     } 
    } 
} 

전화가에 중단 점을 넣어,하고 말하는 것을 참조 :이 모델 상태를 읽고 덤프 오류를 디버그 로그됩니다 확장 방법이다.

ModelState.DumpErrors(); 
+0

DumpErrors()는 출력 창에 아무 것도 보내지 않았습니다. 그리고 내 EF'.SaveChanges()'를 감싸는'if (ModelState.IsValid)'조건은 true입니다 (ModelState가 유효합니다). – Joe

+0

흠. Ok, fiddler2를 가동하고 요청을 검토하십시오. 양식 데이터에 데이터가 채워져 있습니까? – asawyer

0

드롭 다운 목록에 아무 것도 입력되어 있지 않습니다. 당신이있어 :

@Html.DropDownList("AppointmentTypeId", String.Empty) 

그래서 당신은 선택할 수없는 옵션을 가지고있다. VisitAppointmentTypeId 속성은 항상 비어 있습니다.

보기

@{ 
    List<Appointment> appointmentTypes = ViewBag.AppointmentTypeOptions; 
    var appointmentList = new SelectList(list, "AppointmentID", "Description"); 
} 
@Html.DropDownListFor(x => x.AppointmentTypeId, appointmentList) 

컨트롤러

ViewBag.AppointmentTypeOptions = someDataStore.getAppointmentTypes(); 

참고 나는이 단순한를 만들기 위해 ViewBag을 사용했는데 : 귀하의 선택 목록은 관련 텍스트와 값을 옵션으로 채워 져야합니다 HTTP 게시물에서 Visit 클래스를 계속 사용하도록 허용합니다. 원하는 경우이 목록에 대한 정보를 보유 할 ViewModel을 만들 수 있습니다.

0

하나의 속성을 사용하여 매핑 할 수 있으며 PsychometristId 및 Psychometrists 목록과 같은 사용 가능한 옵션을 포함 할 수 있습니다. 그런 다음 DropDownList 대신 DropDownListFor를 사용하십시오. 당신은 몇 가지 코드를 게시 할 수이

@Html.DropDownListFor("PsychometristId", new SelectList(Psychometrists, "name", "id")) 
관련 문제