Binden Sie einen Routewert an eine Eigenschaft eines Objekts, das Teil des Ansichtsmodells ist
Ich habe folgende Route:
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = "" } // Parameter defaults
);
und ich benutze das 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; }
}
}
Ich benötige eine Möglichkeit, die Parameter-ID der Route an Model.ProductDetail.ProductID zu binden.
/ Produkte / Display / 2 sollte führen zu:
Model.ProductDetail.ProductID == 2
Ich weiß, das sieht ein bisschen seltsam aus: Es wäre viel einfacher, wenn mein ViewModel nur so wäre
öffentliche Klasse ProductViewModel {public int Id {get; set;}}
Für die Behandlung von Teilwerten bevorzuge ich die Aggregation. Ich kann ID in der ViewModel-Hauptklasse wirklich nicht haben.
Ich bin mir ziemlich sicher, dass ich meinen eigenen ModelBinder implementieren muss, aber ich sehe nicht, wo ich meine eigenen Regeln implementieren soll.
Wie kann ich den Routenparameter "id" der Eigenschaft Model.ProductDetail.ProductID zuordnen?
BEARBEITEN:
So wird's gemacht -
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); }
}