Преимущество ModelBinder для lib.web.mvc

В чем преимущество создания ModelBinder при использовании lib.web.mvc.?

Этот пример 2011 года не использует ModelBinder

http://tpeczek.blogspot.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 ответ

Связующие модели предоставляют одну из самых удобных функций, которые MVC может предложить. Основная задача Model Binders - преобразовать строки запросов HTML в строгие типы. Из коробки, связующие модели MVC отлично работают, но у вас может быть сильный тип, который не работает со связующими по умолчанию. В этом случае вы можете создать свой собственный. Или вы можете настроить их, например, возможно, постбэк содержит только одно строковое значение, которое вы хотите вернуть целому классу или даже модель представления, заполненную вещами.

При работе с поведением по умолчанию следует помнить следующее: 1) MVC создает новости для своих собственных методов действий, которые принимают первый параметр модели или класса модели представления! 2) Затем он попытается заполнить этот новый экземпляр данными, возвращенными из веб-формы (используя пары имя / значение) строки запроса. 3) Проверка объекта (полей) происходит до того, как будет выполнена первая строка в контроллере. 4) Привязка модели MVC НЕ выдаст ошибку, если отсутствуют поля данных (убедитесь, что в полях опубликованной формы есть все, что вам нужно.

Наконец, с функциональностью, описанной выше, вы можете пройти долгий путь без написания пользовательских связывателей. Однако они предназначены для того, чтобы справляться с крайними случаями или любыми "хитростями", которые вы хотите реализовать, чтобы сделать ваше приложение простым и понятным. Для меня я почти всегда использую строго типизированные представления и модели представлений, так как MVC отлично поддерживает полную привязку представлений к моделям представлений.

Другие вопросы по тегам