1

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;
        }
    }
4

1 に答える 1

0

モデル バインダーは、MVC が提供する最も便利な機能の 1 つを提供します。モデル バインダーの主な仕事は、HTML クエリ文字列を厳密な型に変換することです。既定の MVC モデル バインダーは優れた機能を果たしますが、既定のバインダーでは機能しない強力な型がある場合があります。その場合は、独自に作成できます。または、それらをカスタマイズすることもできます。たとえば、ポストバックには、クラス全体またはものでパックされたビューモデルを返したい単一の文字列値のみが含まれている場合があります。

デフォルトの動作で留意すべき点は次のとおりです。1) MVC は、モデルまたはビュー モデル クラスの最初のパラメーターを受け取る独自のアクション メソッドのインスタンスをニュースアップします。2) 次に、クエリ文字列の Web フォーム (名前と値のペアを使用) から返されたデータを新しいインスタンスに入力しようとします。3) オブジェクト (フィールド) の検証は、コントローラーの最初の行が実行される前に行われます。4) フィールド データが欠落している場合、MVC モデル バインディングはエラーをスローしません (投稿されたフォーム フィールドに必要なものがすべて揃っていることを確認してください。

最後に、上記の機能を使用すると、カスタム バインダーを作成せずに長い道のりを歩むことができます。ただし、それらは、アプリケーションをスリムで意味のあるものにするために実装したいエッジケースまたは「トリック」を処理するために存在します。私にとっては、ほとんどの場合、強く型付けされたビューとビュー モデルを使用します。これは、MVC がビュー モデルへの完全なビュー バインディングをサポートする優れた仕事をしているためです。

于 2014-11-01T16:15:52.590 に答える