编程语言
首页 > 编程语言> > c#-具有域驱动设计的MVC .NET表单

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