我想处理这样的网址:
/Id/Key1/Value1/Key2/Value2/Key3/Value3/
现在,我已经建立了这样的规则:
/{id}/{*parameters}
parameters
对象作为单个string
传递给形成响应所涉及的所有操作。这确实有效,但我遇到了一些问题:
string
。当然,我已经制作了一个将string
转换为Dictionary<string, string>
的扩展方法,但如果调度机制直接给我的方法Dictionary<string, string>
,我更喜欢它 - 或者,更好的是,实际的对作为单独的参数。?Key1=Value1
)添加参数。我想我可以用我想要的格式编写专门的帮助器,但如果有办法让现有的重载符合上述路由规则,我更喜欢它。有办法实现上述目标吗?
答案 0 :(得分:4)
您可以编写自定义路线:
public class MyRoute : Route
{
public MyRoute()
: base(
"{controller}/{action}/id/{*parameters}",
new MvcRouteHandler()
)
{
}
public override RouteData GetRouteData(HttpContextBase httpContext)
{
var rd = base.GetRouteData(httpContext);
if (rd == null)
{
return null;
}
string parameters = rd.GetRequiredString("parameters");
IDictionary<string, string> parsedParameters = YourExtensionMethodThatYouAlreadyWrote(parameters);
rd.Values["parameters"] = parsedParameters;
return rd;
}
public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
{
object parameters;
if (values.TryGetValue("parameters", out parameters))
{
var routeParameters = parameters as IDictionary<string, object>;
if (routeParameters != null)
{
string result = string.Join(
"/",
routeParameters.Select(x => string.Concat(x.Key, "/", x.Value))
);
values["parameters"] = result;
}
}
return base.GetVirtualPath(requestContext, values);
}
}
可以这样注册:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.Add("my-route", new MyRoute());
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
现在您的控制器操作可以采用以下参数:
public ActionResult SomeAction(IDictionary<string, string> parameters)
{
...
}
就产生这种模式的链接而言,它很简单:
@Html.RouteLink(
"Go",
"my-route",
new {
controller = "Foo",
action = "Bar",
parameters = new RouteValueDictionary(new {
key1 = "value1",
key2 = "value2",
})
}
)
或者如果您想要<form>
:
@using (Html.BeginRouteForm("my-route", new { controller = "Foo", action = "Bar", parameters = new RouteValueDictionary(new { key1 = "value1", key2 = "value2" }) }))
{
...
}
答案 1 :(得分:1)
为专门的字典编写自己的模型绑定器。如果你有一个,就不需要在每个动作方法中解析字符串。