在MVC中,通常会显示一些索引视图,从中可以调用其他操作,例如“编辑”。在大多数情况下,“后退”按钮的编码很简单,因为我们知道我们想返回的位置,即“索引”操作。
但是,在某些情况下,可能会在许多地方调用某些“编辑”操作。现在,我们不知道要去哪里。
我尝试了各种将returnUrl参数传递给操作的方法(例如,将当前RawUrl添加为要在被调用操作处处理的参数的HtmlHelpers),但它们似乎总是存在一些缺陷。例如,您最终需要跟踪某个操作的调用是否来自Ajax。
有人找到一个简单可行的解决方案吗?我已经在下面发布了我的
答案 0 :(得分:0)
我创建了一个动作属性,仅装饰某些动作,例如“索引”。这只是将当前的rawUrl存储在会话中
public class ReturnableActionFilter : ActionFilterAttribute, IActionFilter
{
void IActionFilter.OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.HttpContext.Session["ReturnUrl"] = filterContext.RequestContext.HttpContext.Request.RawUrl;
this.OnActionExecuting(filterContext);
}
在面包屑局部视图中,我在会话中查找返回URL,并检查它是否为当前操作。如果不是,则会显示一个返回URL(我们不会返回我们已经执行的操作)。
string returnUrl = null;
var controllerName = ViewContext.RouteData.GetRequiredString("controller");
var actionName = ViewContext.RouteData.GetRequiredString("action");
// we don't return to the same controller/action we are in
if (Session["ReturnUrl"] is string r)
{
if (!r.StartsWith("/" + controllerName + "/" + actionName))
{
returnUrl = r;
}
}
返回链接
@if (returnUrl != null)
{
<li class="breadcrumb-item" title="Back"><a href="@(returnUrl)">←Back</a></li>
}
在一个动作中,我还可以查找会话值,例如在执行编辑后返回。