2014-03-12 2 views
1

편집보기에 사용되는 ViewModel이 있습니다. 데이터가 반환되면 편집 할 항목의 ID가 편집 뷰에 표시되지 않습니다.ViewModel이 입력 필드를 채우지 않습니다.

public ActionResult Edit(int id) 
{ 
    Parcel parcel = _parcelDao.GetParcel(id); 

    ParcelEditViewModel viewModel = new ParcelEditViewModel(); 

    viewModel.id = parcel.id; 
    return View(viewModel); 
} 

보기와 다른 것을 반환해야합니까?

뷰 모델 :

public class ParcelEditViewModel 
{ 

    public Parcel parcel { get; set; } 
    public int id { get; set; } 
    public IEnumerable<SelectListItem> TrackStatus { get; set; } 

    public ParcelEditViewModel() 
    { 
     parcel = new Parcel(); 

     TrackStatus = new List<SelectListItem> 
     { 
      new SelectListItem 
      { 
       Value = "AwaitingCollection", 
       Text = "Awaiting Collection" 
      }, 
      new SelectListItem 
      { 
       Value = "OutForDelivery", 
       Text = "Out For Delivery" 
      }, 
      new SelectListItem 
      { 
       Value = "Delivered", 
       Text = "Delivered" 
      } 

    }; 

    } 
    public int ParcelStatus { get; set; } 
} 

보기 :

//@model ABC.Data.Parcel 
@model Abc.ViewModels.ParcelEditViewModel 

@{ 
    ViewBag.Title = "Edit"; 
} 

<h2>Edit</h2> 

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> 

@using (Html.BeginForm()) { 
@Html.ValidationSummary(true) 
<fieldset> 
    <legend>Parcel</legend> 

    @Html.HiddenFor(model => model.parcel.id) 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.parcel.Forename) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.parcel.Forename) 
     @Html.ValidationMessageFor(model => model.parcel.Forename) 
    </div> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.parcel.Surname) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.parcel.Surname) 
     @Html.ValidationMessageFor(model => model.parcel.Surname) 
    </div> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.parcel.CompanyName) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.parcel.CompanyName) 
     @Html.ValidationMessageFor(model => model.parcel.CompanyName) 
    </div> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.parcel.Address1) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.parcel.Address1) 
     @Html.ValidationMessageFor(model => model.parcel.Address1) 
    </div> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.parcel.Address2) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.parcel.Address2) 
     @Html.ValidationMessageFor(model => model.parcel.Address2) 
    </div> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.parcel.Address3) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.parcel.Address3) 
     @Html.ValidationMessageFor(model => model.parcel.Address3) 
    </div> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.parcel.Postcode) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.parcel.Postcode) 
     @Html.ValidationMessageFor(model => model.parcel.Postcode) 
    </div> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.ParcelStatus) 
    </div> 
    <div class="editor-field"> 
     @Html.DropDownListFor(model => model.parcel.TrackingStatus, Model.TrackStatus) 
     @Html.ValidationMessageFor(model => model.ParcelStatus) 
    </div> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.parcel.TrackingNumber) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.parcel.TrackingNumber) 
     @Html.ValidationMessageFor(model => model.parcel.TrackingNumber) 
    </div> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.parcel.CustomerId) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.parcel.CustomerId) 
     @Html.ValidationMessageFor(model => model.parcel.CustomerId) 
    </div> 

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

<div> 
@Html.ActionLink("Back to List", "Index") 
당신은 당신의보기 모델의 속성 모든를 채울 필요가

+0

보기를 올리시겠습니까? –

답변

0

; ID뿐만 아니라 ParcelEditViewModel에는 데이터베이스에있는 내용을 알지 못합니다. 이와을 간소화하는 데 도움이 될 수 있습니다 AutoMapper로 매핑 라이브러리가

public ActionResult Edit(int id) 
{ 
    Parcel parcel = _parcelDao.GetParcel(id); 
    ParcelEditViewModel viewModel = new ParcelEditViewModel(); 
    viewModel.id = parcel.id; 

    // Populate other properties! These may not be right. 
    viewModel.ProductName = parcel.Title; 
    viewModel.RecipientName; = parcel.RecipientName; 

    return View(viewModel); 
} 

있습니다.

+0

viewModel 또는 다른 클래스 파일에서 그렇게하지 않겠습니까? ActionResult 대신 – StudentRik

+1

컨트롤러가 맵핑되지 않습니다. 뷰 모델에서이 작업을 수행하면 MVC 디자인 패턴의 핵심 원칙에 위배되는 도메인 모델에 뷰를 묶어 버린 것입니다. 별도의 정적 매핑 클래스 또는 콘트롤러 액션을 깔끔하게 유지하기 위해 그것을 끌어 내고 싶다면, 그것은 의미가 있지만 콜을 여전히 컨트롤러 액션에 위치시켜야합니다. –

관련 문제