Привязать значение маршрута к свойству объекта, который является частью viewmodel
У меня есть следующий маршрут:
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = "" } // Parameter defaults
);
и я использую ViewModel:
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.
/ Продукция / Дисплей / 2 должно привести к:
Model.ProductDetail.ProductID == 2
Я знаю, это выглядит немного странно: было бы намного проще, если бы моя ViewModel была бы только
public class ProductViewModel {public int Id {get; set;}}
Для обработки частичных я предпочитаю использовать агрегацию. Я действительно не могу иметь идентификатор в основном классе ViewModel.
Я уверен, что мне нужно реализовать свой собственный 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); }
}