【问题标题】:Appending hash/fragment to RedirectResult results in cumbersome code将哈希/片段附加到 RedirectResult 会导致繁琐的代码
【发布时间】:2018-06-09 00:23:20
【问题描述】:

代码有效,但很愚蠢。

当视图返回给用户时,页面滚动到 companyId 锚点。

愚蠢的是,我必须用 another route(没有“terms”)公开另一个 public 操作

我想重定向到 /terms/companyId 但是我得到一个 ambigiousAction 异常,表明这个具有相同路由的操作已经存在......

如果可能不改变第一条路线,如何解决这个困境?

[HttpGet("~/terms/{companyId}")]
public IActionResult Home(string companyId})
{
    string url = Url.Action(nameof(HomeForRedirect), new { companyId}) + "#conditions";
    return new RedirectResult(url);
}

[HttpGet("{companyId}")]
public IActionResult HomeForRedirect(string companyId)
{
    Viewbag.CompanyId = companyId;
    return View(nameof(Home));
}

【问题讨论】:

  • 哈希通常是客户端的东西。所以我认为它应该出现在你点击到达那里的链接中,而不是在 HomeController 中设置。
  • 谢谢我完全忘记了它确实有效,并且如此专注于附加哈希服务器端,因为我在 SO 上找到了很多关于它的帖子并认为它必须是一个解决方案,但实际上它是一个麻烦的解决方案:-),谢谢!

标签: asp.net-core asp.net-core-2.0 asp.net-core-mvc-2.0


【解决方案1】:

如果我理解您的代码,您实质上是希望 URL /terms/{companyId} 重定向到 /{controller}/{companyId}#conditions?最简单的方法是将两条路由附加到相同的操作并在有条件的情况下进行重定向。比如:

[HttpGet("{companyId}", Order = 1)]
[HttpGet("~/terms/{companyId}", Order = 2)]
public IActionResult Home(string companyId)
{
    if (Context.Request.Path.StartsWith("/terms"))
    {
        var url = Url.Action(nameof(Home), new { companyId }) + "#conditions";
        return Redirect(url);
    }

    ViewBag.CompanyId = companyId;
    return View();
}

更好的方法是直接在 IIS 中进行重定向。在 ASP.NET Core 机器中处理请求需要进行大量的处理,而仅仅重定向完全是浪费精力。使用 IIS 中的 URL Rewrite 模块为该 URL 设置重定向,然后您的应用程序完全不必担心它。您只需执行返回视图的常规 Home 操作,一切都会正常运行。

其他一些注意事项,因为您似乎对此不熟悉:

  • 最好使用Route 属性而不是更具体的HttpGet 等。默认为GET。
  • 返回Redirect 等控制器方法,而不是IActionResult 的实例(即new RedirectResult(...))。
  • 默认是返回与操作同名的视图。所以,假设你的操作是Home,你可以只做return View(),而不是return View(nameof(Home))

【讨论】:

  • 感谢您的提示,但请参阅我上面的评论。你写了这么多,我不得不赞成你的回答或者我有一种不好的感觉;-)
猜你喜欢
  • 1970-01-01
  • 2018-01-28
  • 2020-05-16
  • 2015-07-15
  • 1970-01-01
  • 2013-11-23
  • 2014-01-10
  • 1970-01-01
  • 2021-07-22
相关资源
最近更新 更多