我在asp.net mvc中打招呼,我有些疑惑。
P.S:我正在使用DDD来学习
我在Controller中有一个ACtion,它将通过存储库(对于数据库)保存一个实体(来自我的模型)。 我的疑问是,如何从View中获取信息并通过Controller中的存储库保存? 在控制器的Save方法中获取我的Model实体是否正确,如下所示:
public ActionResult Save(产品产品)
{
//验证对象
//将数据保存在存储库中
return View(“成功”);
}
或者我需要一个DTO(具有与我的实体类似的结构)并创建一个对象,通过属性将属性传递给实体? 我不喜欢FormCollection,我想知道,建议的是什么?
非常感谢你们
干杯
答案 0 :(得分:1)
通常,在ASP.NET MVC中,控制器操作将在编辑实体类型时接收DefaultModelBinder返回的强类型对象。使用此模式,您可以将“Product”自身或作为DTO的一部分传递到GET视图,然后“Save”方法将在其参数列表中接收“Product”对象。
只要您使用编辑器模板或具有匹配名称的字段(即Html.TextBox("Name")
对应于Product.Name
),则DefaultModelBinder应该能够正确填充传递给action方法的类型化实体对象。除了在某些边缘情况下,你不应该乱用FormCollection。
[HttpGet]
public ActionResult Create() {
return View("Create", new Product());
}
[HttpPost]
public ActionResult Create(Product product) { //or Save(Product)
...
}
答案 1 :(得分:1)
可以通过添加所谓的view model来解决此类问题。
基本上 - 视图模型是为特定视图提供数据的DTO。以类似的方式 - 视图模型用于通过模型绑定从视图中获取数据。然后 - 控制器只需将必要的数据转发到域模型。
答案 2 :(得分:1)
我想遵循蓝皮书所描述的DDD实践,您应该将您的视图绑定到DTO,这可以转发到一个瘦的“应用程序”层,在该层中创建或从数据库中检索Domain对象。此应用程序层可以是带有方法的简单外观,也可以利用命令模式。
对于现场演示,您可以看到我的项目 - DDDSample.NET
答案 3 :(得分:0)
只要表单的字段与Product中的字段匹配,就应根据值自动填充它们。保存实体的方式取决于数据模型,无论是创建新记录还是编辑现有记录等。