【问题标题】:ASP.NET MVC 2 Create Model using POSTASP.NET MVC 2 使用 POST 创建模型
【发布时间】:2010-08-03 15:00:33
【问题描述】:

我有以下型号:

public class Product {
 public int Id { get; set; }
 public string Name { get; set; }
 private int CategoryId { get; set; }
 public Category Category { get; set; }
 public string InventoryDetails { get; set; }
}

我的控制器中有一个用于创建新产品的操作。我的问题是如何限制可以从 POST 数据绑定的模型的属性?因为我只希望用户 POST 数据绑定 Name 和 CategoryId。还是创建一个只有这些属性可以绑定的单独视图模型更好?

public ActionResult Create(Product p)

public ActionResult Create(CreateProductViewModel model)

在哪里

public class CreateProductViewModel {
 public string Name {get; set;}
 public int CategoryId {get;set;}
}

【问题讨论】:

    标签: asp.net-mvc entity-framework validation


    【解决方案1】:

    使用视图模型。这将使您的视图与数据模型分离。正如您发现的那样,它们并不总是具有相同的需求,并且模型应该特定于视图。对于更复杂的场景,您可以手动映射属性或使用AutoMapper

    【讨论】:

      【解决方案2】:

      始终使用 ViewModel。使用 ViewModel,根据视图的需要弯曲数据模型要容易得多。这是 Jimmy Bogard 的一篇很酷的文章。

      http://www.lostechies.com/blogs/jimmy_bogard/archive/2009/06/29/how-we-do-mvc-view-models.aspx

      【讨论】:

        【解决方案3】:

        或者你可以这样做:

        public ActionResult Create (FormCollection collection) {
            Product p = new Product();
            UpdateModel(p, new string[] { "Name", "CategoryId" });
            //....
        }
        

        【讨论】:

        • 但是由于使用了“魔术”字符串,您失去了可重构性和类型安全性。
        • 并非如此,您可以随时枚举它们,或者将它们保存在常量变量中。我只是提供选项。
        【解决方案4】:
        public ActionResult Create([Bind(Exclude = "Category,Id,InventoryDetails")]Product prod){
        
        /*do your magic*/
        
        }
        

        ASP.NET MVC 默认模型绑定器将排除不必要的字段。

        注意:如果您的视图数据格式几乎等于数据模型,则创建单独的视图模型不是一个好习惯。仅当两者不同时才创建单独的视图模型。

        【讨论】:

          猜你喜欢
          • 2016-06-08
          • 2020-10-24
          • 2014-01-31
          • 1970-01-01
          • 1970-01-01
          • 2012-04-09
          • 2016-11-22
          • 1970-01-01
          • 2011-04-11
          相关资源
          最近更新 更多