ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c#-具有域驱动设计的MVC .NET表单

2019-12-09 00:17:31  阅读:229  来源: 互联网

标签:binding c asp-net-mvc


我在大多数.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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有