c#-具有域驱动设计的MVC .NET表单
作者:互联网
我在大多数.NET MVC示例中看到的模式是让模型成为在控制器和较低层之间传递的对象,并直接与它们进行形式绑定.我选择了domain-driven方法,在该方法中,层之间传递了域对象.想法是将这些对象传递到视图中.
我遇到的问题是表单页面.我打算为表单提供单独的对象,以便在返回时绑定到表单(其中也包含验证批注).我将其与域对象区分开来,因为单个对象可能由不同的页面更新,每个页面都有其自己的验证要求(例如,一个人的地址甚至可能不在一个页面上显示,而是在另一页面上显示,所以验证并不总是适用于通用域对象).一旦您回发表单并需要显示错误,这会使事情变得复杂.
以更新页面为例.我将视图键入我的域Person对象,然后页面将填充该字段的字段值.回发操作将采用该页面的form对象并对其进行验证.如果通过了,我将使用automapper将值从表单复制到域对象并保存.所有这一切.出现问题的地方是重新显示该页面.如果将其键入域对象,我最终将只是根据旧值而不是用户输入的值重新填充字段.如果将其键入到表单对象,那么我需要将每个页面的所有域对象都转换为这些表单对象(如果我需要一些值,可能仍需要传入域对象,我将对该页面使用只读).
我确定我在这里忽略了一些东西.
更新由于@Charlino所说的,在玩耍后发现了一个有趣的发现.如果我使用强类型的html助手进行输入(Html.TextBoxFor()),即使将视图键入到域对象,它也会记住这些值.如果我使用通用的(Html.TextBox())或原始HTML,则似乎没有.
解决方法:
我最终要做的是每个视图都有一个ViewModel对象.
因为我必须定义ViewModel和映射,所以这是前期工作,但是该代码是如此简单明了,只需几秒钟即可编写.
通常,当我需要一个表单时,我会创建一个单独的Form对象,并让ViewModel包含它.
public class MyViewModel
{
public string SomeNonFormDisplayValue { get; set; }
public bool AnotherDisplayOnlyValue { get; set; }
public IEnumerable<Tuple<int, string>> SelectionListItems { get; set; }
public MyViewsForm Form { get; set; }
}
public class MyViewsForm
{
public string EditableProperty { get; set; }
public int SelectionListItemId { get; set; }
}
我在ViewModel上键入View,但是使Post Action Method仅采用以下形式.
public class MyController
{
[HttpGet]
public ActionResult Edit() { ... }
[HttpPost]
public ActionResult Edit(MyViewsForm form) { ... }
}
我还使用查询方法来检索ViewModel,一个用于填充表单,另一个不填充-用于当我返回带有错误的POST表单时.
标签:binding,c,asp-net-mvc 来源: https://codeday.me/bug/20191208/2095215.html