2009-07-02 79 views
1

的一部分,我有以下途徑:綁定routevalue一個對象的屬性是視圖模型

  routes.MapRoute(
      "Default",            // Route name 
      "{controller}/{action}/{id}",       // URL with parameters 
      new { controller = "Home", action = "Index", id = "" } // Parameter defaults 
     ); 

我用的是視圖模型:

namespace MvcApplication1.Models 
{ 
    public class ProductViewModel 
    { 

     public ProductViewModel() 
     { 
      ProductDetail = new ProductInfo(); 
     } 

     public ProductInfo ProductDetail { get; set; } 

    } 

    public class ProductInfo 
    { 
     public string Name { get; set; } 
     public int ProductID { get; set; } 
    } 

} 

我需要一種方法來綁定到Model.ProductDetail.ProductID的路線的參數ID。

/產品/顯示/ 2應該導致:

Model.ProductDetail.ProductID == 2

我知道這看起來有點怪:這將是更簡單的,如果我的視圖模型只會

public class ProductViewModel {public int Id {get; set;}}

對於處理partials,我更喜歡使用聚合。我真的不能在主ViewModel類中有ID。

我很舒服,我需要實現我自己的ModelBinder,但我沒有看到我應該實現自己的規則。

如何將路徑參數「id」映射到屬性Model.ProductDetail.ProductID?

編輯:

下面是它如何做 -

public class ProductModelBinder: DefaultModelBinder 
{ 
    protected override void BindProperty(
     ControllerContext controllerContext, 
     ModelBindingContext bindingContext, 
     System.ComponentModel.PropertyDescriptor propertyDescriptor 
     ) { 
      if (bindingContext.ModelType == typeof(ProductViewModel) 
      && String.Compare(propertyDescriptor.Name, "ProductDetail", true) == 0)  
      {   
       int id = int.Parse((string)controllerContext.RouteData.Values["id"]); 
       ProductViewModel productView = bindingContext.Model as ProductViewModel; 
       productView.ProductDetail.ProductID = id;   
       return;  
     }  
     base.BindProperty(controllerContext, bindingContext, propertyDescriptor); } 
} 
+0

但是,這將不填充productView.ProductDetail.Name,或ViewModel中的其他任何東西。它基本上會給你一個無用的ProductViewModel對象,因爲只有id被填充。 – Jason 2009-07-02 21:55:30

+0

我想我的例子不是很好。在真正的應用程序中,我只需要ProductDetail中的id。其他屬性通過訪問存儲庫在控制器內部填充。 – 2009-07-02 22:13:26

回答

1

嘗試是這樣的(未測試):

public class CustomModelBinder : DefaultModelBinder 
{ 
    protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor) 
    { 
     if (bindingContext.ModelType == typeof(ProductInfo) 
      && String.Compare(propertyDescriptor.Name, "ProductID", true) == 0) 
     { 
      var id = (int)controllerContext.RouteData.Values["id"]; 

      var productInfo = bindingContext.Model as ProductInfo; 

      productInfo.ProductID = id; 

      return; 
     } 

     base.BindProperty(controllerContext, bindingContext, propertyDescriptor); 
    } 
} 
相關問題