使用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
}
但是最新的例子正在使用它们
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;
}
}
答案 0 :(得分:0)
模型绑定器提供了MVC提供的最方便的功能之一。型号粘合剂'主要工作是将HTML查询字符串转换为强类型。开箱即用,MVC模型绑定器做得很好,但是你可能有一个不能使用默认绑定器的强类型。在这种情况下,您可以创建自己的。或者您可以自定义它们,例如,回发可能只包含您想要返回整个类的单个字符串值,甚至包含填充内容的viewmodel。
默认行为要记住的事情有:1)MVC新闻实例,它拥有采用模型或视图模型类的第一个参数的Action方法! 2)然后,它将尝试使用查询字符串的Web窗体(使用名称/值对)返回的数据填充该新实例。 3)对象(字段)的验证发生在执行控制器的第一行之前。 4)如果缺少字段数据,MVC模型绑定不会抛出错误(确保您发布的表单字段包含您需要的所有内容。
最后,通过上述功能,您可以在不编写自定义绑定器的情况下走很长的路。然而,他们在那里处理边缘情况或任何"技巧"您希望实施以使您的应用程序精益求精。对我来说,我几乎总是使用强类型视图和视图模型,因为MVC在支持全视图绑定到视图模型方面做得很好。