asp.net 有关视图模型和使用字段子集进行模型更新的最佳实践

tf7tbtn2  于 2023-02-06  发布在  .NET
关注(0)|答案(4)|浏览(123)

通过选择MVC来开发我们的新网站,我发现自己正处于“最佳实践”之中,这些实践显然是真实的地围绕着我开发的。两周前,NerdDinner是我的指导,但随着MVC 2的开发,即使是它也似乎过时了。这是一次令人兴奋的经历,我感到每天都能与聪明的程序员密切接触是一种荣幸。
现在,我偶然发现了一个问题,我似乎不能得到一个直接的答案-无论如何,从所有的博客-我想从社区得到一些见解。这是关于编辑(阅读:编辑操作)。大量的材料,教程和博客,涉及创建和查看模型。所以,虽然这个问题可能没有拼出一个问题,我希望得到一些讨论进行,有助于我的发展道路,我采取的决定。
我的模型用几个字段来表示用户,如姓名、地址和电子邮件。实际上,所有的姓名都在一个字段上,每个字段代表名字、姓氏和中间名。详细信息视图显示所有这些字段,但您一次只能更改一组字段,例如,你的名字。用户展开一个表单,而其他字段仍然可见的上方和下方。因此,回发的表单包含表示模型的字段子集。
虽然这对我们和我们的布局问题很有吸引力,但出于各种原因,严肃的MVC开发人员会避开它。我一直在阅读一些模式和最佳实践,似乎这与viewmodel == view的范式并不一致。或者我错了?
无论如何,NerdDinner规定使用FormCollection和UpdateModel。所有的空字段都被愉快地忽略了。从那时起,MVC社区已经放弃了这种方法,以至于MVC 2中的bug没有被发现。如果你的formCollection中没有一个完整的模型,UpdateModel就不能工作。
最受好评的view model pattern似乎是 * 包含自定义视图模型实体的Dedicated视图模型 *,也是唯一一个可以与我的设计问题兼容的。它需要大量繁琐的Map,尽管通过使用AutoMapper和Jimmy博加德的ideas减轻了这一点,但这可能值得也可能不值得。他还提出了视图和视图模型之间1:1的关系。
为了与这些设计范例保持一致,我将为我的每个扩展字段集创建一个视图和关联视图。每个视图模型将几乎相同,只有只读字段不同,视图还包含许多重复的标记。这对我来说似乎很荒谬。将来我可能希望能够显示两个、更多或所有同时打开的字段集。
我将非常认真地阅读我希望引发的讨论。

huwehgph

huwehgph1#

我是这样做的(Map是在modelBuilder中使用ValueInjecter自动完成的):
我有一个asp .net-mvc示例应用程序,其中我演示了在mvc中执行此操作的最佳实践,您可以在download of the valueinjecter中看到它

public ActionResult Edit(long id)
 {
      return View(modelBuilder.BuildModel(personService.Get(id)));
 }

 [HttpPost]
 public ActionResult Edit(PersonViewModel model)
 {
    if (!ModelState.IsValid)
       return View(modelBuilder.RebuildModel(model));    
       personService.Save(modelBuilder.BuildEntity(model));
       return RedirectToAction("Index");
 }

ValueInjecter的快速演示:

//build viewmodel
    personViewModel.InjectFrom(person)
                   .InjectFrom<CountryToLookup>(person);
    
//build entity
    person.InjectFrom(personViewModel)
          .InjectFrom<LookupToCountry>(personViewModel);
uqzxnwby

uqzxnwby2#

最近有一些帖子是关于验证模型的问题的,这篇帖子来自布拉德Wilson“Input Validation vs. Model Validation in ASP.NET MVC“。
最初的问题与ASP.NET MVC如何处理验证发布的模型有关,如果您不想编辑模型中的某些元素,并且没有在视图中提供字段,但您的控制器正在处理整个模型,则可能有人会使用附加字段对您的控制器进行POST。
因此,使用特定于视图的模型可以确保只有您想要编辑的字段才可以编辑。

mjqavswn

mjqavswn3#

我也有同样的问题,但我不能很好地表达出来。
在我的例子中,会有大量的ViewModel,因为不同的用户会看到基于一组角色的不同表单。我认为ViewModel和View之间的1:1关系非常模糊。如果我编写一个uber-View,几乎只使用EditorForModel,而不使用其他功能,会怎么样?现在我有一个视图,尽管高度退化,用于所有内容,所以我也只有一个ViewModel?
我的想法是编写一个不仅基于反射工作的EditorForModel(即编译时已知的信息),还可以(域特定的)运行时规则,例如由当前用户的角色、当前时间等管理。因此,还需要编写具有验证的定制ModelBinder以及从模型到视图模型的定制Map。这样我就不会编写愚蠢的、容易出错的代码。
自从我的模特(或DomainModel)包含大量逻辑,我不希望通过ModelBinding修改它。此外,由于不可能知道在编译时将出现哪些字段,因此不可能提供适当的ViewModel。然而,“full”(即最大ViewModel)是已知的。从ViewModel到Model的Map同样涉及自定义代码,但只要规则能够正式化,就应该行得通。
抱歉,我的短信很混乱,但我自己现在也很混乱,加上我得走了。像CT一样,也不能发表评论。

chy5wohz

chy5wohz4#

看看这个.这就是ASP.NETMVC2的使用方法.

public void Update(MyModel model)
        {
            var myModelObject = MyRepository.GetInstance(model.Id);
            if(myModelObject != null)
            {
                ModelCopier.CopyModel(model, myModelObject);
            }
            MyRepository.Save(myModelObject);
        }

CopyModel(obj from,obj to)是最新的MvcFutures中的一个新函数。另外,请务必查看MVC Futures 2中的可扩展模型绑定器。

相关问题