Asp.net mvc ViewModel不填充输入字段

Asp.net mvc ViewModel不填充输入字段,asp.net-mvc,mvvm,Asp.net Mvc,Mvvm,我有一个用于编辑视图的ViewModel。返回数据时,要编辑的项目的ID不会显示在编辑视图上 public ActionResult Edit(int id) { Parcel parcel = _parcelDao.GetParcel(id); ParcelEditViewModel viewModel = new ParcelEditViewModel(); viewModel.id = parcel.id; return View(viewModel);

我有一个用于编辑视图的ViewModel。返回数据时,要编辑的项目的ID不会显示在编辑视图上

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; }
}
公共类ParcelEditViewModel
{
公共地块{get;set;}
公共int id{get;set;}
公共IEnumerable TrackStatus{get;set;}
公共ParcelEditViewModel()
{
地块=新地块();
TrackStatus=新列表
{
新建SelectListItem
{
Value=“waitingcollection”,
Text=“等待收集”
},
新建SelectListItem
{
Value=“OutForDelivery”,
Text=“外出交付”
},
新建SelectListItem
{
Value=“已交付”,
Text=“已交付”
}
};
}
公共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")
/@model ABC.Data.Parcel
@模型Abc.ViewModels.ParcelEditViewModel
@{
ViewBag.Title=“编辑”;
}
编辑
@使用(Html.BeginForm()){
@Html.ValidationSummary(true)
包裹
@Html.HiddenFor(model=>model.parcel.id)
@LabelFor(model=>model.parcel.Forename)
@EditorFor(model=>model.parcel.Forename)
@Html.ValidationMessageFor(model=>model.parcel.Forename)
@Html.LabelFor(model=>model.parcel.nam姓氏)
@Html.EditorFor(model=>model.parcel.nam姓氏)
@Html.ValidationMessageFor(model=>model.parcel.nam姓氏)
@LabelFor(model=>model.parcel.CompanyName)
@EditorFor(model=>model.parcel.CompanyName)
@Html.ValidationMessageFor(model=>model.parcel.CompanyName)
@LabelFor(model=>model.parcel.Address1)
@EditorFor(model=>model.parcel.Address1)
@Html.ValidationMessageFor(model=>model.parcel.Address1)
@LabelFor(model=>model.parcel.Address2)
@EditorFor(model=>model.parcel.Address2)
@Html.ValidationMessageFor(model=>model.parcel.Address2)
@LabelFor(model=>model.parcel.Address3)
@EditorFor(model=>model.parcel.Address3)
@Html.ValidationMessageFor(model=>model.parcel.Address3)
@LabelFor(model=>model.parcel.Postcode)
@EditorFor(model=>model.parcel.Postcode)
@Html.ValidationMessageFor(model=>model.parcel.Postcode)
@LabelFor(model=>model.ParcelStatus)
@Html.DropDownListFor(model=>model.parcel.TrackingStatus,model.TrackStatus)
@Html.ValidationMessageFor(model=>model.ParcelStatus)
@LabelFor(model=>model.parcel.TrackingNumber)
@EditorFor(model=>model.parcel.TrackingNumber)
@Html.ValidationMessageFor(model=>model.parcel.TrackingNumber)
@LabelFor(model=>model.parcel.CustomerId)
@EditorFor(model=>model.parcel.CustomerId)
@Html.ValidationMessageFor(model=>model.parcel.CustomerId)

} @ActionLink(“返回列表”、“索引”)

您需要填充视图模型的所有属性;不仅仅是ID。
ParcelEditViewModel
不知道数据库中有什么

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);
}

有这样的映射库可以帮助简化这一过程。

您也可以发布视图吗?您不会在viewModel或其他类文件中这样做吗?而不是ActionResultAbsolutely not-映射属于控制器。如果您在视图模型中这样做,那么您已经将视图绑定到了域模型,这是不好的,并且违反了MVC设计模式的核心原则。如果您想将其拉入一个单独的静态映射类或其他东西以保持控制器操作整洁,这是有意义的,但是对它的调用应该仍然驻留在控制器操作中。