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

问题描述 投票:0回答:1

代码有效,但很傻。

当View返回给用户时,页面会滚动到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));
}
asp.net-core asp.net-core-2.0 asp.net-core-mvc-2.0
1个回答
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重写模块设置此URL的重定向,然后您的应用程序根本不必担心它。你只需要恢复视图的普通普通Home动作,一切都会正常工作。

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

  • 最好使用Route属性而不是更具体的HttpGet等。默认是GET。
  • 返回像Redirect这样的控制器方法而不是IActionResult(即new RedirectResult(...))的实例。
  • 默认设置是返回与操作同名的视图。所以,假设你的行动是Home,你可以做return View(),而不是return View(nameof(Home))
© www.soinside.com 2019 - 2024. All rights reserved.