代码有效,但很愚蠢。
当视图返回给用户时,页面会滚动到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));
}
答案 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))
。