首页 > 解决方案 > 针对控制器发布的模型的命名约定?

问题描述

我们使用术语ViewModel来表示从控制器返回并传递给视图的类。我们没有使用 ViewBag 或 ViewData,而是使用了一个强类型类,它基本上存储了视图需要的每个值。

public IActionResult OrderStep1()
{
    var model = new ViewModelStep1()
    {
      SomeProperty = "SomeValue",
       ...
    }
    return View(model);
}

我正在寻找一个命名约定,它指定我们应该如何命名一个包含从表单的提交按钮发布到控制器的属性的类。在以下示例中,我选择OrderStep2了该类的临时名称。

对于我们的多步骤订单向导,我们使用Post/Redirect/Get模式。因此,我可以丰富信息OrderStep2并返回特定的 ViewModel OrderStep2VM

[HttpPost]
[ValidateAntiForgeryToken]
[Route("order/step2")]
public async Task<IActionResult> OrderStep2(OrderStep2 model)
{
  // save some changes into the database and retrieve a GUID configurationId
 return RedirectToAction(nameof(OrderStep2()), new { configurationId = "GUID" });
}

[Route("order/step2/{configurationId}")]
public IActionResult OrderStep2(Guid configurationId)
{
   // retrieve configuration from database based on the configurationID
   // do something else
   var model = new OrderStep2VM()
   {
      ....
   };
   return View(model);
}

由于我希望代码组织良好,因此我想将类分组OrderStep2到一个单独的命名空间中。目前,我正在考虑将它们称为PostModels,即 ,OrderStep2PM但我不想为可能已经存在的东西定义一个新术语。

(如果您想知道我为什么不使用 TempData:应用程序的工作流程需要保存不完整的表单数据,这允许我跳过 TempData,因为无论如何我都需要存储在数据库中)。

标签: c#asp.net-coreasp.net-core-mvcnaming-conventions

解决方案


很简单,您发送到视图的模型应该与您从视图返回的模型相同。因此,如果您正在使用ViewModelStep1then 这也是您应该在 post 操作中绑定的内容。

术语“视图模型”是从 MVVM(模型-视图-视图模型)中偷来的,因为它在 MVC 中的用途与 MVVM 中的视图模型相似。如果您不喜欢从您的帖子绑定到的模型被称为“视图模型”这一事实,那么您可以简单地使用更通用的东西,如“DTO”(数据传输对象),它在模型绑定的上下文和为视图提供数据。

总而言之,这里没有硬性规定。以最有意义的方式命名您的课程。这些名字并不神奇。但是,无论您如何命名该类,您都将对视图模型和绑定模型使用相同的名称。


推荐阅读