asp.net-mvc – ASP.NET MVC – 从视图部分更新模型

前端之家收集整理的这篇文章主要介绍了asp.net-mvc – ASP.NET MVC – 从视图部分更新模型前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我只是想知道人们如何处理这种情况.在我使用ORM(MVC)的情况下,这似乎是一个弱点(在这种情况下是NHibernate)…

假设你的模型中有一个细粒度和复杂的实体.您可能会有一个管理页面来管理此类型的对象.如果实体很复杂,那么您不可能以一种形式修改整个实体.您仍然需要将相关属性传递给视图,并在视图返回时将更改合并到模型中的这些属性.

有人在这种情况下做什么?

>创建一个(或包含)实体属性子集的视图模型.通过这个视图.在控制器中的“编辑”操作方法中,从存储库获取对象,然后查看viewmodel中的所有属性,并将其应用于Model对象(model.a = viewmodel.a,modelb = viewmodel.b).这似乎是明显的明智之路,但却产生了大量繁琐的管道代码.此外,这样会使验证复杂一些.
>还有什么?

我已经看了一下automapper – 但这似乎并不适合账单,也许我错了?

谢谢.

解决方法

这听起来像是automapper的完美场景.您创建一个视图模型类,其中包含字段或实际模型的一部分,您可以让AutoMapper将域模型对象中的值提取到视图模型对象中.你有什么问题与这种方法

考虑这个例子:

这是您的域模型和您的视图模型

public class Person
{
    public string FirstName
    { get; set; }

    public string LastName
    { get; set; }

    public string HomeNumber
    { get; set; }

    public string Address1
    { get; set; }

    public string Address2
    { get; set; }
}

public class Personviewmodel
{
    public string FirstName
    { get; set; }

    public string LastName
    { get; set; }

    public string HomeNumber
    { get; set; }
}

这是您的映射,您必须从dm-> vm和vm-> dm在两个方向创建映射.

使用Automapper时我看到的是,如果将对象A映射到B,并且B具有A没有的属性,则它将被重置.所以当我创建地图我指示它忽略那些缺少的属性.我不是一个Automapper专家,所以我可能会使用它错了.

制图

Mapper.CreateMap<Person,Personviewmodel>();
// Automapper will reset values in dest which don't exist in source,so be sure to ignore them!
Mapper.CreateMap<Personviewmodel,Person>()
    .ForMember(dest => dest.HomeNumber,opt => opt.Ignore());

最后用法

Person p = new Person()
{
    FirstName = "First",LastName = "Last",Address1 = "add 1",Address2 = "add 2"
};

Personviewmodel pvm = Mapper.Map<Person,Personviewmodel>(p);
// Map to a new person
Person p2 = Mapper.Map<Personviewmodel,Person>(pvm);

// Map to the existing person just to update it
Person p3 = new Person()
{
    HomeNumber = "numberHere"
};

// This will update p3
Mapper.Map<Personviewmodel,Person>(pvm,p3);

由于排除,这显然不如理想,而是比手动做整件事好多了.

原文链接:https://www.f2er.com/aspnet/250552.html

猜你在找的asp.Net相关文章