将哈希/片段附加到RedirectResult会导致繁琐的代码

时间:2017-12-28 12:41:32

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

代码有效,但很愚蠢。

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

愚蠢是我必须用另一条路线(没有“条款”)公开另一个公开行动

我想重定向到/ 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));
}

1 个答案:

答案 0 :(得分:1)

如果我理解您的代码,您基本上希望网址/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重写模块设置此URL的重定向,然后您的应用程序根本不必担心它。你只需要正常的Home动作即可返回一个视图,一切都会正常工作。

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

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