2010-08-16 57 views
1

我的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 } 
    ); 

我是否需要以某种方式改变呢?有没有其他的方式来使模型绑定器绑定到视图模型的属性内的属性?

我试过改变路线,以代替shareClassId,它变成了shareClass_Id,希望ModelBinder知道它需要找到一个ShareClass对象来绑定Id,但它不起作用。

回答

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与您的viewmodel类。

[ModelBinder(typeof(ShareClassViewModelBinder))] 
public class ShareClassViewModel { 
相关问题