2010-08-16 1 views
1

My ViewModel класс обладает свойством, которое содержит объект ShareClass. ShareClass имеет свойство под названием Id.Как я могу привязать модель к объекту, существующему в моей модели ViewModel?

Я в настоящее время прохождения ShareClass id в метод действия следующим образом:

public ActionResult ListedFactsheet(int shareClassId) 
{ 

}  

Я хотел бы быть в состоянии использовать ShareClassViewModel хотя вместо передачи в int следующим образом:

public ActionResult ListedFactsheet(ShareClassViewModel scv) 
{ 
    // I'd like to be able to do something like: svc.ShareClass.Id; 
} 

где мой ShareClassViewModel определяется как:

public class ShareClassViewModel 
{ 
    public ShareClass ShareClass { get; set; } 
} 

и ShareClass определяется как:

public class ShareClass 
{ 
    public virtual int Id { get; set; } 
} 

Моя текущая конфигурация маршрута устанавливается как:

routes.MapRoute(
    null, 
    "listedfactsheet/{shareClassId}", 
    new { controller = "shareclass", action = "ListedFactsheet", shareClassId = -1 } 
    ); 

мне нужно изменить это как-то делать? Есть ли другой способ сделать привязку Model Binder к свойствам в свойствах View Model?

Я попытался изменить маршрут так, чтобы вместо shareClassId он стал shareClass_Id в надежде, что ModelBinder будет знать, что ему нужно найти объект ShareClass для привязки идентификатора, но он не работает.

ответ

1

Создать класс ShareClassViewModelBinder, полученный из DefaultModelBinder. Перезапишите метод BindModel.

public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
{ 
    ValueProviderResult valueProviderResult; 
    int shareClassId = -1; 
    if (bindingContext.ValueProvider.TryGetValue("shareClassId", out valueProviderResult)) 
    { 
     shareClassId = valueProviderResult.ConvertTo(typeof(int)); 
    } 
    ShareClassViewModel shareClassViewModel = ... // create Viewmodel instance 
    shareClassViewModel.ShareClass = new ShareClass() { Id = shareClassId }; 

    return shareClassViewModel; 
} 

Зарегистрируйте модель этой модели с классом видимости.

[ModelBinder(typeof(ShareClassViewModelBinder))] 
public class ShareClassViewModel {