Как я могу привязать модель к свойству, которое существует в моей модели представления? - PullRequest
1 голос
/ 16 августа 2010

Мой класс ViewModel имеет свойство, которое содержит объект ShareClass. ShareClass имеет свойство под названием Id.

В настоящее время я передаю 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 }
    );

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

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

1 Ответ

1 голос
/ 16 августа 2010

Создайте класс 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 {
...