我正在寻找在路由中管理长网址的最佳方式。我有很多看起来像这样的行为:
/a/b/c/d/e
路线:
routes.MapRoute(
"xxx",
"{a}/{b}/{c}/{d}/{e}",
new { controller = "Xxx", action="Xxx"});
控制器:
public ActionResult Xxx(int a, int b, int c, int d, int e) { ... }
params的任何变化都会在每个路径/动作中产生多变化,这就是问题所在。它没有弹性。是否有可能将params映射到某个对象?看起来像:
public ActionResult Xxx(RouteParams rp) { ... }
嗯...最终我认为我可以使用Action Filter来解决这个问题:
private RouteParams rp;
public override void OnActionExecuting(FilterExecutingContext filterContext) {
rp = new RouteParams(...);
}
但我不喜欢这个解决方案
祝你好运
答案 0 :(得分:4)
像你一样创建一个对象,并使用ModelBinder来构造它而不是过滤器。默认模型绑定器应该工作,如果没有,则创建一个自定义绑定器。
答案 1 :(得分:2)
保持您的路线设置相同,只需创建一个新的模型,其属性与路线设置中的参数匹配:
public class XxxModel
{
public int a { get; set; }
public int b { get; set; }
public int c { get; set; }
public int d { get; set; }
public int e { get; set; }
}
然后在操作中使用XxxModel作为参数:
public ActionResult Xxx( XxxModel model )
{
...
}
a,b,c,d和e将映射到模型中的属性。
答案 2 :(得分:0)
这对你有用吗?
routes.MapRoute(
"xxx",
"{*params}",
new { controller = "Xxx", action="Xxx"});
和
public ActionResult Xxx(string params) { ... }
params将是一个字符串(例如1/2/3/4/5)
您必须对参数执行params.Split("/")
和Convert.ToInt32()
。