1

我想使用 MVC 路由编写一个 URL 缩短器。问题是我想使用以下 URL:{host}/?{word}

为此,我使用 MapRoute 方法让默认值转到正确的控制器。确实如此,但是当它将 null 传递给参数而不是 {word} 的内容时。

如果我指定参数名称,同样的事情会正常工作,即 {host}/?{param-name}={word}

有谁知道如何告诉 MVC,如果我不指定参数名称,那么它应该转到第一个参数或默认参数?

4

1 回答 1

3

您可以尝试编写放在您的操作方法上的操作过滤器。动作过滤器应该通过 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 它将传递“默认”。

如果那是你想要的

于 2012-04-23T19:15:44.843 回答