模型绑定器对lib.web.mvc的好处

时间:2014-11-01 15:52:53

标签: model-binding lib.web.mvc

使用lib.web.mvc时创建ModelBinder有什么好处。 ?

2011年的这个例子不使用ModelBinder

http://tpeczek.com/2011/03/jqgrid-and-aspnet-mvc-strongly-typed.html

public class ProductViewModel
{
  #region Properties
  public int Id { get; set; }

  public string Name { get; set; }

  [JqGridColumnSortingName("SupplierId")]
  public string Supplier { get; set; }

  [JqGridColumnSortingName("CategoryId")]
  public string Category { get; set; }

  [DisplayName("Quantity Per Unit")]
  [JqGridColumnAlign(JqGridColumnAligns.Center)]
  public string QuantityPerUnit { get; set; }

  [DisplayName("Unit Price")]
  [JqGridColumnAlign(JqGridColumnAligns.Center)]
  public decimal? UnitPrice { get; set; }

  [DisplayName("Units In Stock")]
  [JqGridColumnAlign(JqGridColumnAligns.Center)]
  public short? UnitsInStock { get; set; }
  #endregion

  #region Constructor
  public ProductViewModel()
  { }

  public ProductViewModel(Product product)
  {
    this.Id = product.Id;
    this.Name = product.Name;
    this.Supplier = product.Supplier.Name;
    this.Category = product.Category.Name;
    this.QuantityPerUnit = product.QuantityPerUnit;
    this.UnitPrice = product.UnitPrice;
    this.UnitsInStock = product.UnitsInStock;
  }
  #endregion
}

但是最新的例子正在使用它们

http://tpeczek.codeplex.com/SourceControl/latest#trunk/ASP.NET%20MVC%20Examples/jqGrid%20Examples/jqGrid/Models/ProductViewModel.cs

namespace jqGrid.Models
{
    [ModelBinder(typeof(ProductViewModelBinder))]
    public class ProductViewModel
    {
        #region Properties
        public int? ProductID { get; set; }

        public string ProductName { get; set; }

        public int SupplierID { get; set; }

        public int CategoryID { get; set; }

        public string QuantityPerUnit { get; set; }

        public decimal UnitPrice { get; set; }

        public short UnitsInStock { get; set; }
        #endregion
    }

public class ProductViewModelBinder : DefaultModelBinder
    {
        public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            ProductViewModel model = (ProductViewModel)base.BindModel(controllerContext, bindingContext);

            if (controllerContext.HttpContext.Request.Params["id"] != "_empty")
                model.ProductID = Convert.ToInt32(controllerContext.HttpContext.Request.Params["id"]);
            model.SupplierID = Convert.ToInt32(controllerContext.HttpContext.Request.Params["Supplier"]);
            model.CategoryID = Convert.ToInt32(controllerContext.HttpContext.Request.Params["Category"]);
            model.UnitPrice = Convert.ToDecimal(controllerContext.HttpContext.Request.Params["UnitPrice"].Replace(".", CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator));

            return model;
        }
    }

1 个答案:

答案 0 :(得分:0)

模型绑定器提供了MVC提供的最方便的功能之一。型号粘合剂'主要工作是将HTML查询字符串转换为强类型。开箱即用,MVC模型绑定器做得很好,但是你可能有一个不能使用默认绑定器的强类型。在这种情况下,您可以创建自己的。或者您可以自定义它们,例如,回发可能只包含您想要返回整个类的单个字符串值,甚至包含填充内容的viewmodel。

默认行为要记住的事情有:1)MVC新闻实例,它拥有采用模型或视图模型类的第一个参数的Action方法! 2)然后,它将尝试使用查询字符串的Web窗体(使用名称/值对)返回的数据填充该新实例。 3)对象(字段)的验证发生在执行控制器的第一行之前。 4)如果缺少字段数据,MVC模型绑定不会抛出错误(确保您发布的表单字段包含您需要的所有内容。

最后,通过上述功能,您可以在不编写自定义绑定器的情况下走很长的路。然而,他们在那里处理边缘情况或任何"技巧"您希望实施以使您的应用程序精益求精。对我来说,我几乎总是使用强类型视图和视图模型,因为MVC在支持全视图绑定到视图模型方面做得很好。