根据MVC 4中的URL深度过滤列表项

时间:2015-04-08 13:36:09

标签: asp.net-mvc asp.net-mvc-4 asp.net-mvc-routing

我正在学习MVC。经过长时间的尝试而没有成功,我在这里寻求你的帮助。

我正在开发一个爱好项目,频道指南网站,其中列出了包含语言和类别的频道。

网址:Channel/English,显示英语语言频道
网址:Channel/Sports,显示频道属于体育类别 网址:Channel/English/Sports,显示属于体育类别的英语频道
网址:Channel/Sports/English,显示频道属于体育类别,其语言为英语

控制器名称:ChannelController
动作方法代码如下

public ActionResult Index(string language = "All", string category = "All")
{
    List<ViewModel.ChannelIndex> list = client.GetList(1, language, category);
    return View(list);
 }

以下是我为每个频道生成div的HTML代码

<div class="col-md-6 col-sm-6">
    <a href="@Url.RouteUrl("DefaultLanguageFirst", new { language = channel.LanguageId })">@channel.LanguageName</a>  
    <a href="@Url.RouteUrl("DefaultCategoryFirst", new { category = channel.CategoryId })">@channel.CategoryName</a>
</div>

以下是RouteConfig的代码

           routes.MapRoute(
                name: "DefaultLanguageFirst",
                url: "{controller}/{language}/{category}",
                defaults: new { controller = "Channel", action = "Index", language = UrlParameter.Optional, category = UrlParameter.Optional}
            );

            routes.MapRoute(
                name: "DefaultCategoryFirst",
                url: "{controller}/{category}/{language}",
                defaults: new { controller = "Channel", action = "Index", category = UrlParameter.Optional, language = UrlParameter.Optional }
            );

我能感觉到我做错了什么 顺便说一下,我也尝试使用@Html.ActionLink代替@Url.RouteUrl,结果是一样的。

我的问题如下:
1)如何以单一动作方式处理这些请求 2)为什么@Url.RouteUrl不基于mapRoute名称进行区分,即DefaultLanguageFirst&amp; DefaultCategoryFirst
3)是否真的可以根据我的尝试进行过滤。

有人可以帮助我了解我出错的地方或我可以参考解决问题的任何资源。

提前致谢。

1 个答案:

答案 0 :(得分:1)

这永远不会如你所愿!你可以有一条路线,如:

routes.MapRoute(
    name: "DefaultStuffRoute",
    url: "Channel/{category}/{language}",
    defaults: new { controller = "Channel", action = "Index", language = UrlParameter.Optional}
);

然后只使用

  • 网址:频道/体育,节目频道属于体育类别。
  • 网址:频道/体育/英语,节目频道属于体育类别,其语言为英语

用你的方式说出

channel/<string>/<string>

对于你的两个路线,如果第一个字符串是一个类别或语言,asp将永远无法解决。

<强>更新 当谈到在MVC或WebAPI中进行过滤时,我会考虑使用查询字符串参数。

  • Url:channels / cnn / - CNN频道的所有节目
  • 网址:channels / cnn /?lang = zh_cn所有CNN频道的节目 英语
  • 网址:channels / cnn /?cat = sports - CNN频道的所有节目 与体育有关的
  • 网址:渠道/ cnn /?lang = en&amp; cat =体育 - 所有CNN英语和体育相关的节目