MVC返回网址建议

时间:2018-07-20 10:24:08

标签: model-view-controller returnurl

在MVC中,通常会显示一些索引视图,从中可以调用其他操作,例如“编辑”。在大多数情况下,“后退”按钮的编码很简单,因为我们知道我们想返回的位置,即“索引”操作。

但是,在某些情况下,可能会在许多地方调用某些“编辑”操作。现在,我们不知道要去哪里。

我尝试了各种将returnUrl参数传递给操作的方法(例如,将当前RawUrl添加为要在被调用操作处处理的参数的HtmlHelpers),但它们似乎总是存在一些缺陷。例如,您最终需要跟踪某个操作的调用是否来自Ajax。

有人找到一个简单可行的解决方案吗?我已经在下面发布了我的

1 个答案:

答案 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)">&larr;Back</a></li>
}

在一个动作中,我还可以查找会话值,例如在执行编辑后返回。