我想使用 MVC 路由编写一个 URL 缩短器。问题是我想使用以下 URL:{host}/?{word}
为此,我使用 MapRoute 方法让默认值转到正确的控制器。确实如此,但是当它将 null 传递给参数而不是 {word} 的内容时。
如果我指定参数名称,同样的事情会正常工作,即 {host}/?{param-name}={word}
有谁知道如何告诉 MVC,如果我不指定参数名称,那么它应该转到第一个参数或默认参数?
我想使用 MVC 路由编写一个 URL 缩短器。问题是我想使用以下 URL:{host}/?{word}
为此,我使用 MapRoute 方法让默认值转到正确的控制器。确实如此,但是当它将 null 传递给参数而不是 {word} 的内容时。
如果我指定参数名称,同样的事情会正常工作,即 {host}/?{param-name}={word}
有谁知道如何告诉 MVC,如果我不指定参数名称,那么它应该转到第一个参数或默认参数?
您可以尝试编写放在您的操作方法上的操作过滤器。动作过滤器应该通过 url 查询参数,如果它找到具有空值的参数,它可以绑定到参数。
public override void OnActionExecuting(ActionExecutingContext filterContext) {
if (filterContext.HttpContext.Request.Url != null) {
NameValueCollection urlQuery = System.Web.HttpUtility.ParseQueryString(filterContext.HttpContext.Request.Url.Query);
for (int i = 0; i < urlQuery.Keys.Count; i++ )
{
if (urlQuery.Get(urlQuery[i]) == null)
{
filterContext.ActionParameters["word"] = urlQuery[i];
}
}
}
base.OnActionExecuting(filterContext);
}
你必须写一些非空条件,这样它就不会失败:)
编辑: 如果你想放弃?只需使用默认的 mvc url 路由,就像这样。
routes.MapRoute(
"UrlShortener", // Route name
"{word}", // URL with parameters
new { controller = "UrlShortener", action = "Fetch", word="Default", }
);
您的控制器将接受
public ActionResult UrlShortener(string word) {
if (word == "Default") return Content("No word specified");
//some BLL
return View();
}
这样你的 url 将是http://hostname/word,如果没有指定 word 它将传递“默认”。
如果那是你想要的