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)
这是没有使用模型绑定器的情况。技巧可能会有所帮助。
归档时间: |
|
查看次数: |
189 次 |
最近记录: |