加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc-3 – ASP.NET MVC 3一对多表格

发布时间:2020-12-16 03:25:19 所属栏目:asp.Net 来源:网络整理
导读:我有使用Entity Framework Code First映射的这些类: public class Person{ public int PersonId { get; set; } public string Name { get; set; } //... additional properties [Required] public virtual ICollectionAddress Addresses { get; set; }}publ
我有使用Entity Framework Code First映射的这些类:

public class Person
{
    public int PersonId { get; set; }
    public string Name { get; set; }
    //... additional properties
    [Required]
    public virtual ICollection<Address> Addresses { get; set; }
}
public class Address
{
    public int AddressId { get; set; }
    public string Street { get; set; }
    //... additional properties

    public int PersonId { get; set; }
    public virtual Person Person { get; set; }
}

因此,使用ASP.NET MVC 3,如何在一个表单中执行人员编辑视图以填充地址中的所有人员属性?

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

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

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

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

这可以很好地显示来自数据库的Street输入,但是当我进行提交时,Street不会改变.

[HttpPost]
public ActionResult Edit(int id,FormCollection formCollection)
{
    Person person = unityOfWork.PersonRepository.GetById(id);

    UpdateModel<Person>(person);

    if (ModelState.IsValid)
    {
        unityOfWork.PersonRepository.Update(person);
        unityOfWork.SaveChanges();
        return RedirectToAction("Index");
    }

    return View(person);
}

解决方法

由于模型绑定器必须修复集合的方式,因为相关的ID不存在,所以会很困难.

最好为此屏幕创建一个ViewModel,并在它与底层域模型之间进行转换.

如果你提供编辑所有地址的工具,我会使用Steve Sanderson’s BeginCollectionItem helper.但由于你只编辑一个地址,一个带有Person属性和一个单独的Address属性的新ViewModel类会更容易,或者使用一个类包括与此视图相关的Person和Address中的属性.

我是分离关注的重要支持者.您的应用程序中有三个模型;描述数据库中数据存储实现的实体模型,描述UI中数据表示实现的View模型和域模型,它是应用程序中数据的逻辑表示.正如你在这里所做的那样,为每个目的使用相同的模型很诱人.但是,只要您的要求变得非常重要,它就会成为负担,因此您最好创建在您需要的地方最有效的类.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读