【问题标题】:ASP.NET MVC - Get a URL to the current action that doesn't include the passed IDASP.NET MVC - 获取不包含传递的 ID 的当前操作的 URL
【发布时间】:2009-12-11 01:32:11
【问题描述】:

我有一个动作,我想截取任何可能的整数 id 并将其放在哈希后面。 (我有一些处理 id 的 Javascript)。我这样做只是为了像我这样的 URL 黑客,他们可能会忘记我在 id 之前放置哈希的约定。

这是我的行动:

public ActionResult Edit(int? id)
{
    if (id != null) return Redirect(Url.Action("Edit") + "/#" + id);

    return View();
}

问题在于 Url.Action 方法保留了传递的 id。 Url.Action("Edit") 正在返回“{controller}/Edit/{id}”。我希望它只返回“{controller}/Edit”! (而且我的代码添加了一个额外的“/#{id}”)。

例如,对这个 URL 的请求:

http://localhost:2471/Events/Edit/22

正在重定向到此 URL:

http://localhost:2471/Events/Edit/22/#22

当我希望它重定向到这个 URL 时:

http://localhost:2471/Events/Edit/#22

我很沮丧。有谁知道如何获取不包含传递的 id 的当前操作的 URL?

【问题讨论】:

  • 我找到了解决方法。将 Url.Action("Edit") 替换为 Url.Action("blahblah").Replace("blahblah","Edit")。

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


【解决方案1】:

这样做的一种方法是为控制器操作定义一个路由,例如,该路由将被定义为“{controller}/{action}/”。然后使用类似于以下内容的内容来构建您的实际 URL:

Url.RouteUrl("MyRoute") + "#" + id

不是最好的方法,但它有效。也许有一天微软会为路由添加片段支持。

【讨论】:

    【解决方案2】:

    我不完全确定,但你可以使用 RedirectToAction 方法吗?

    http://msdn.microsoft.com/en-us/library/system.web.mvc.controller.redirecttoaction.aspx

    【讨论】:

    • 查看我的 cmets 以获取 Chris Shaffer 的答案——它是 URL 编码的“#”。
    【解决方案3】:

    我不是 100% 确定(也没有我的开发机器要测试),但我认为你可以在 id 参数中传递哈希值,它会起作用...例如:

    Url.Action("Edit", "Events", new { id = "#" + id });
    

    或者你可以用同样的方式使用 RedirectToAction()。

    另一种方法是定义一个路由 {controller}/{Action}/#{id} 然后使用 Url.Route() 代替。

    【讨论】:

    • 嗯,关闭,但它是对“#”进行 URL 编码。所以重定向到 /Events/Edit/%2322
    • 我也尝试定义到 {controller}/{action}/#{id} 的路由,但它再次对“#”进行 URL 编码。
    • D'oh,没想到 URL 编码。我想我的最后一个建议是定义一条完全不包含可以连接的 id 的路由;例如路由“{controller}/{Action}/”,然后像你一样添加“#id”。
    • 是的,这行得通。谢谢你。编辑您的答案,我会接受。
    • 我改为添加了一个新答案 - 认为这样对话不会毫无意义,而且人们可以看到不这样做的方法:)
    猜你喜欢
    • 2014-10-02
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    • 2010-11-02
    • 2016-09-06
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多