【问题标题】:Mvc: Exclude id from urlMvc:从 url 中排除 id
【发布时间】:2013-04-25 01:32:22
【问题描述】:

我的 cshtml 页面中有下一个 foreach,它允许我在每个模型项中进行迭代

@foreach (var item in Model)
{
    <div class="date">
        @item.pubDate
    </div>
    <a href="@Url.RouteUrl("Details", new { action = "Details", controller = "News", id = item.id, title = item.title })">
        <img src="some route" alt="some alt" />                 
    </a>
}

所以现在它工作正常,foreach 循环中的每个元素都有一个类似的 url

http://something.com/News/Details/1/first-title
http://something.com/News/Details/2/second-title

可以使用类似的东西创建网址

http://something.com/News/Details/first-title
http://something.com/News/Details/second-title

但我仍然可以将 id 参数发送到我的控制器?

提前致谢

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 routes global-asax


    【解决方案1】:

    添加另一条路线:

    routes.MapRoute(
        name: "NewsTitleRoute",
        url: "News/Details/{id}/{title}",
        defaults: new { 
            controller = "News", 
            action = "Details", 
            id = UrlParameter.Optional, 
            title = UrlParameter.Optional 
            }
    );
    

    在你的控制器中像这样声明 details 方法,两个参数是可选的:

    public ActionResult Details(int? id, string title="")
    {
    }
    

    该路由配置和Details 方法适用于:

    【讨论】:

    • 我应该在控制器中为 id 参数做什么?,我需要 title 和 id,但只在我的 url 中显示标题......它不适合我。
    • 请看我更新的答案。我更改了路由的配置方式。如果您同时需要 id 和参数,则需要传递它。否则你的网站怎么知道id没有收到呢?
    • 好吧,你说得对,我认为可以通过某种“隐藏”方式发送 id,仅在 url 中显示标题,我想做什么不一定是可能的? :(
    • 好吧,假设您将id 放在隐藏字段上并执行GET 请求提交表单,该ID 仍将附加在URL 上。我没有尝试从查询字符串中隐藏参数,我相信这是不可能的。除非有什么神奇的方法。
    • 随时乐意为您提供帮助
    【解决方案2】:

    您可以将title 属性传递给id 参数。

    @Url.RouteUrl("Details",
                  new { action = "Details", controller = "News", id = item.title})
    

    然后在您的操作方法中将id 参数的类型设置为字符串:

    public ActionResult Details(string id)
    

    或者您可以像 von-v 的回答一样创建自定义路线。只需确保它高于默认路由即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-03
      • 2021-11-12
      • 1970-01-01
      • 2013-06-26
      • 2014-11-08
      • 1970-01-01
      • 2019-03-07
      相关资源
      最近更新 更多