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); }
}
但是,這將不填充productView.ProductDetail.Name,或ViewModel中的其他任何東西。它基本上會給你一個無用的ProductViewModel對象,因爲只有id被填充。 – Jason 2009-07-02 21:55:30
我想我的例子不是很好。在真正的應用程序中,我只需要ProductDetail中的id。其他屬性通過訪問存儲庫在控制器內部填充。 – 2009-07-02 22:13:26