asp.net-mvc - ViewModel不填充输入字段

标签 asp.net-mvc mvvm

我有一个用于编辑 View 的ViewModel。返回数据后,要编辑的项目的ID不会显示在编辑 View 中。

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

    ParcelEditViewModel viewModel = new ParcelEditViewModel();

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

我应该返回与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; }
}

View :
//@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")

最佳答案

您需要将 View 模型属性的所有填充;不只是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);
}

有诸如AutoMapper之类的映射库可以帮助简化此过程。

关于asp.net-mvc - ViewModel不填充输入字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22354626/

相关文章:

javascript - 尝试使用 typescript 从 Angular 2 调用 MVC Get Action

wpf - MVVM 框架 : Performance

c# - 在 WPF MVVM 模式中打开子窗口 - 正确的解决方案?

internet-explorer - SVG未在Firefox和IE中使用Kendo模板渲染

c# - WPF 用户控件不显示

asp.net-mvc - MVC 框架比较(主要是成本/速度权衡)

c# - 有没有可靠的方法来确定文本文件?

jQuery/asp.net-mvc : How can I display Hierarchical Data using IHierarchicalEnumerable?

asp.net-mvc - RadioButton用于不在编辑器模板中选择值

java - 实例化SharedViewModel