将参数绑定到复杂类型

Hoo*_*ini 8 asp.net-mvc model-binding asp.net-mvc-routing asp.net-mvc-5

我有一个导航栏,有几个链接,如下所示:

<a href="MyController/Browse/2">MenuItem1</a>

这个请求会触及我的动作方法:

public ActionResult Browse(int departmentId)
{
    var complexVM = MyCache.GetComplexVM(departmentId);
    return View(complexVM);
}
Run Code Online (Sandbox Code Playgroud)

这是我的ComplexVM:

public class ComplexVM 
{
    public int DepartmentId { get; set; }
    public string DepartmentName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

MyCache,是一个静态的部门列表,我保留在内存中,所以当用户传入时DepartmentId,我不需要DepartmentName从DB 获取相应的.

这工作正常...但如果我能以某种方式初始化ComplexVM自定义模型绑定器,而不是在Controller中初始化它会很好...所以我仍然想要使用链接(菜单项),但这一次,CustomModelBinder将我的参数2绑定到ComplexVM:它需要从id MyCache和2中查找部门的名称并初始化ComplexVM,然后ComplexVM将传递给此操作方法:

public ActionResult Browse(ComplexVM complexVM)
{
    return View(complexVM);
}
Run Code Online (Sandbox Code Playgroud)

我想在没有回复的情况下点击上面的控制器,因为我的导航栏中有很多菜单项链接...不确定这是否可行?或者,如果这是一个好主意?

我已经看到了这个链接,它描述了我想要的东西......但我不确定路由是如何工作的......即routing id:2=>ComplexVM


或者可以这样做RouteConfig,像这样:

routes.MapRoute(
    name: "Browse",
    url: "{controller}/Browse/{departmentId}",
    // this does not compile, just want to explain what I want...
    defaults: new { action = "Browse", new ComplexVM(departmentId) });
Run Code Online (Sandbox Code Playgroud)

小智 3

我可以通过一点点改变和一个技巧来实现这一点

<a href="MyController/Browse?id=1">MenuItem1</a>
Run Code Online (Sandbox Code Playgroud)

控制器动作

public ActionResult Browse(ComplexVM complexVM)
{
return View(complexVM);
}
Run Code Online (Sandbox Code Playgroud)

查看型号

public class ComplexVM
{
    public int DepartmentId { get; set; }
    public string DepartmentName { get; set; }
    public ComplexVM()
    {
        this.DepartmentId = System.Convert.ToInt32(HttpContext.Current.Request("id").ToString);
        this.DepartmentName = "Your name from cache"; // Get name from your cache 
    }
}
Run Code Online (Sandbox Code Playgroud)

这是没有使用模型绑定器的情况。技巧可能会有所帮助。