【问题标题】:MVC concatenated properties in View Model or in ControllerView Model 或 Controller 中的 MVC 级联属性
【发布时间】:2013-03-08 08:24:35
【问题描述】:

我使用 MVC 并有一个问题,构建串联视图模型属性的最佳实践是什么?我可以在两个地方构建连接字段(FullName):

  1. 在这样的模型视图中

     public class User
        {
           public string FirstName { get; set; }
           public string LastName { get; set; }
           public string FullName { get {return FirstName+LastName;} }  
        }
    
    
    public ActionResult Users()
    {
     var model = new User
                 {
                    FirstName = "Tomas",   
                    LastName = "Saint",     
                  });
    
     return View(model);
    }
    
  2. 在控制器中

    public class User
    {
       public string FullName { get; set; }
    }
    
    
    public ActionResult Users()
    {
     var model = new User
                 {
            FullName = "Tomas" + "Saint";   
                  });
    
     return View(model);
    }
    

【问题讨论】:

  • 请将答案标记为正确,如果您得到好的答案,这是正确的做法,否则请说明为什么给出的答案不符合您对好答案的想法。

标签: c# asp.net-mvc model-view-controller separation-of-concerns


【解决方案1】:

如果计算/函数与视图的格式相关联,那么我会继续将功能放入视图模型中,就像您的全名属性一样,这在视图模型中是正确的。但是,如果您有任何需要域逻辑的功能/计算,那么我认为视图模型不适合这样做,并且可以驻留在域模型中以实现可重用性,或者驻留在业务逻辑层中的其他位置。

所以简短的回答 - 视图模型中的视图格式,其他地方的任何域逻辑。

【讨论】:

    【解决方案2】:

    为显示目的计算值的任何方法或属性(如您示例中的 FullName)都属于 ViewModel。这样做为您提供了一种干净、类型安全的方法来将数据传递给视图,并允许视图以一致的方式访问属性。这种方法还具有使该属性在使用该特定 ViewModel 的任何地方都可用的优点。如果您将属性添加到控制器,情况就不会如此。

    下面使用 Razor 语法的示例:

    @model MvcApplication.Models.User
    ...
    <div class="editor-label">
        @Html.LabelFor(m => m.FullName)
    </div>
    <div class="editor-field">
        @Html.DisplayFor(m => m.FullName)
    </div>
    

    【讨论】:

      猜你喜欢
      • 2015-05-14
      • 2012-02-10
      • 2014-01-10
      • 2011-12-04
      • 1970-01-01
      • 1970-01-01
      • 2011-09-19
      • 2012-12-12
      • 1970-01-01
      相关资源
      最近更新 更多