ASP.NET MVC 路由:URL 中的多个参数

ASP.NET MVC Routing: Multiple parameter in URL

我正在尝试将 Web 服务从 PHP 移植到 ASP.NET MVC。当然,这意味着我必须复制现有的 API.

目前,规范形式的调用如下:

http://example.com/book/search?title=hamlet&author=shakes

但是,它也接受另一种形式:

http://example.com/book/search/title/hamlet/author/shakes

大约有五个不同的搜索条件,都是可选的,并且可以按任何顺序给出。

如何在 ASP.NET MVC 路由中做到这一点?

你可以试试这个。

[Route("Book/search/{*criteria}")]
public ActionResult Search(string criteria)
{
    var knownCriterias = new Dictionary<string, string>()
    {
        {"author", ""},
        {"title",""},
        {"type",""}
    };
    if (!String.IsNullOrEmpty(criteria))
    {

        var criteriaArr = criteria.Split('/');
        for (var index = 0; index < criteriaArr.Length; index++)
        {

            var criteriaItem = criteriaArr[index];
            if (knownCriterias.ContainsKey(criteriaItem))
            {
                if (criteriaArr.Length > (index + 1))
                    knownCriterias[criteriaItem] = criteriaArr[index + 1];
            }
        }
    }
    // Use knownCriterias dictionary now.
    return Content("Should return the search result here :)");
}

最后一个以 * 为前缀的参数就像一个 包罗万象的 参数,它将在 Book/search 之后的 url 中存储任何内容。

因此,当您请求 yoursite.com/book/search/title/nice/author/jim 时,默认模型绑定器会将值 "title/nice/author/jim" 映射到 criteria 参数。您可以对该字符串调用 Split 方法以获得 url 段的数组。然后将值转换为字典并将其用于搜索代码。

基本上上面的代码将从溢出的数组中读取并根据您在 url.

中传递的内容设置 knownCriteria 字典项的值