代码有效,但很傻。
当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));
}
如果我理解你的代码,你基本上希望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))
。