我希望能够在调用方法并从true
页面传递Index
刷新参数后刷新页面。但是,下面的函数会将我重定向到SwitchMember()
函数而不是Index
页面。我简化了下面的代码。
以下是来自索引页面( Index.cshtml )的电话:
<a href="@Url.Action("SwitchMember", new { memberId = 123, refresh = true })">Switch</a>
这是调用Controller动作( HomeController.cs ):
public ActionResult SwitchMember(int memberId, bool refresh)
{
// do stuff here
if(refresh) {
// The problem with this is it keeps redirecting me to SwitchMember function
// instead of the Index page
return Redirect(Request.Url.AbsoluteUri);
}
return null;
}
如何使SwitchMember()
成为可重复使用的函数,刷新我从调用的页面,而不是将我重定向到我调用的操作?
答案 0 :(得分:1)
只需将您的回复Redirect(Request.Url.AbsoluteUri);
更改为return RedirectToAction("Index");
即可。请注意,SwitchMember
和Index
操作应位于同一控制器中以使用return RedirectToAction("Index");
,但如果它们位于不同的控制器中,则可以使用return RedirectToAction("Index", "<controller-name>");
<强>更新强>
如果您希望SwitchMember
操作可重复使用,则可以向操作string returnUrl
(以及其他人)添加其他参数Index
,并传递值Request.Url.PathAndQuery
。然后在您的控制器中使用return Redirect(returnUrl)
。如果您不想使用returnUrl
参数,请将Request.Url.AbsoluteUri
更改为Request.Url.PathAndQuery
。
答案 1 :(得分:1)
您可以使用以下内容更改控制器:
public ActionResult SwitchMember(int memberId, string refresh = null)
{
// do stuff here
if (refresh != null)
{
// The problem with this is it keeps redirecting me to SwitchMember function
// instead of the Index page
return View(refresh);
}
return null;
}
在你的网页中使用它之后:
<a href="@Url.Action("SwitchMember", new { memberId = 123, refresh = "About" })">Switch</a>
请注意,您也可以获取当前操作,但我不建议使用此方法,因为在您单击该刷新后,您当前的操作将是 SwitchMember 。
<a href="@Url.Action("SwitchMember", new { memberId = 123, refresh = HttpContext.Current.Request.RequestContext.RouteData.Values["action"].ToString() })">Switch</a>
答案 2 :(得分:0)
就我所关注的案例而言,需要重用可重复行动的案例需要重定向到另一个行动,而另一个行动没有数据模型依赖性可重复使用是由客户分别调用可重用和另一个行动。
在你的情况下,通过ajax调用一个ajax成功调用索引动作来调用SwitchMember动作。在此解决方案中,SwitchMember操作将由ajax调用,因为此操作不会返回任何视图。
其他解决方案有以下缺点:
- 使用returnUrl:通常这是一个安全漏洞,除非解析url到controller和action并使用RedirectToAction(“controller”,“action”);
Preventing Open Redirection Attacks
- 使用ReturnView:失去另一个动作的ViewState。