2012-07-16 35 views
2

我有一個包含患者對象和訪問集合的視圖模型。視圖模型將填充所有正確的屬性值,並且屬性將在編輯視圖中正確顯示。在將模型傳遞給控制器​​的「編輯」(GET)操作中的視圖之前,我還驗證了視圖模型中的屬性值。下拉列表的值不會傳遞迴控制器

問題是,即使在編輯視圖中我沒有更改任何屬性,綁定到下拉列表(性別和條件)的屬性也不會傳遞迴控制器的編輯(POST)操作。這導致拋出異常。

這些屬性具有值,但在某處它們正在丟失。我如何解決這個問題?

ASP.NET MVC 4 RC

public ActionResult Edit(int id = 0) 
{ 
    var patient = this.db.Patients.Where(p => p.Id == id).FirstOrDefault(); 
    var visits = this.db.Visits.Where(v => v.PatientId == patient.Id && v.IsActive).OrderByDescending(v => v.VisitDate); 

    PatientEditViewModel model = new PatientEditViewModel(); 
    model.Patient = patient; 
    model.Visits = visits; 

    if (patient == null) 
    { 
     return this.HttpNotFound(); 
    } 

    ViewBag.GenderId = new SelectList(this.db.Genders, "Id", "Name", patient.GenderId); 
    ViewBag.HandednessId = new SelectList(this.db.Handednesses, "Id", "Name", patient.HandednessId); 

    return this.View(model); 
} 


[HttpPost] 
public ActionResult Edit(PatientEditViewModel model) 
{ 
    Mapper.CreateMap<PatientEditViewModel, Patient>(); 

    var entity = Mapper.Map<PatientEditViewModel, Patient>(model); 

    if (ModelState.IsValid) 
    { 
     this.db.Entry(entity).State = EntityState.Modified; 
     this.db.SaveChanges(); 
    } 

    this.ViewBag.GenderId = new SelectList(this.db.Genders, "Id", "Name", entity.GenderId); 
    this.ViewBag.HandednessId = new SelectList(this.db.Handednesses, "Id", "Name", entity.HandednessId); 

    return this.View(model); 
} 

@model Web.Models.PatientEditViewModel 

@{ 
    ViewBag.Title = "XXX"; 
} 


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

    <fieldset> 
     <legend>Patient</legend> 

     @Html.HiddenFor(model => model.Patient.Id) 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.Patient.GenderId, "Gender") 
     </div> 
     <div class="editor-field"> 
      @Html.DropDownFor("GenderId", String.Empty) 
      @Html.ValidationMessageFor(model => model.Patient.GenderId) 
     </div> 
     <div class="editor-label"> 
      @Html.LabelFor(model => model.Patient.HandednessId, "Handedness") 
     </div> 
     <div class="editor-field"> 
      @Html.DropDownFor("HandednessId", String.Empty) 
      @Html.ValidationMessageFor(model => model.Patient.HandednessId) 
     </div> 
     <div class="editor-label"> 
      @Html.LabelFor(model => model.Patient.Comments) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Patient.Comments) 
      @Html.ValidationMessageFor(model => model.Patient.Comments) 
     </div> 

     <p> 
      <input type="submit" value="Save" /> 
     </p> 
    </fieldset> 
} 

@Html.Partial("_CurrentAndPreviousVisits", Model.Visits) 


@section Scripts { 
    @Scripts.Render("~/bundles/jqueryval") 


} 
+1

請將相關代碼發送給我們 – 2012-07-16 17:58:17

+0

向我們展示獲取操作,發佈操作和查看的代碼 – archil 2012-07-16 17:58:27

+1

用代碼更新的問題... – user1469655 2012-07-16 18:05:38

回答

3

沒有Html.DropDownFor幫手。也許你的意思是Html.DropDownListHtml.DropDownListFor。我個人會建議你第二個和強類型的版本。

因此,在您PatientEditViewModel模型定義了以下屬性:

public string GenderId { get; set; } 
public IEnumerable<SelectList> Genders { get; set; } 

public string HandednessId { get; set; } 
public IEnumerable<SelectList> Handednesses { get; set; } 

,然後在你的控制器動作,您忘了ViewBag並正確填寫您的視圖模型。所以,你用2線視圖模型應用的更換2線ViewBag的:

model.Genders = new SelectList(this.db.Genders, "Id", "Name", patient.GenderId); 
model.Handednesses = new SelectList(this.db.Handednesses, "Id", "Name", patient.HandednessId); 

,並在您的視圖您使用助手的強類型版本:

@Html.DropDownListFor(x => x.GenderId, Model.Genders) 

和:

@Html.DropDownListFor(x => x.HandednessId, Model.Handednesses) 

現在在POST操作中,您將獲得視圖模型的GenderIdHandednessId屬性中的2個選定值。顯然在你的POST動作中,如果你想重新顯示相同的視圖,你可以使用2行視圖模型屬性分配來刪除2行ViewCrap(我的意思是ViewBag)。

相關問題