我如何建模绑定到我的ViewModel中存在的属性?

时间:2010-08-16 11:07:03

标签: c# asp.net-mvc routes model-binding

我的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 个答案:

答案 0 :(得分:1)

创建一个从DefaultModelBinder派生的ShareClassViewModelBinder类。覆盖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;
}

使用您的viewmodel类注册此模型绑定器。

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