繁体   English   中英

我可以将替代返回链接传递给MVC控制器操作吗?

[英]Can I pass an alternative return link to an MVC controller action?

我有一个MVC5应用程序,它具有多个控制器,并带有EF6 CRUD操作和关联的视图。 这些控制器/视图集之一用于管理患者标识符表,并且在完成编辑或删除后,控制器会按预期将操作链接返回到标识符索引视图。

但是,患者标识符也显示在患者控制器的各种视图上,并且从Patient.Edit视图中显示,我具有Html.ActionLink调用,用于标识符控制器的编辑或删除操作。 当从Patient.Edit视图调用后者时,我希望它们在完成时返回到该视图。

我有什么办法可以做到这一点?

是的,但这始终是手动过程。 MVC没有内置专门用于返回URL的东西。

本质上,您的编辑/删除链接将需要包含一个GET参数,通常称为returnUrl ,尽管名称并不重要,该名称将设置为当前页面的URL。 例如:

@Html.ActionLink("Edit", new { id = patient.Id, returnUrl = Request.RawUrl })

然后,您的编辑/删除GET操作应接受此参数,并设置一个ViewBag成员:

public ActionResult Edit(int id, string returnUrl = null)
{
    ViewBag.ReturnUrl = returnUrl;
    return View();
}

在您的编辑表单中,添加一个隐藏字段:

@Html.Hidden("returnUrl", ViewBag.ReturnUrl)

再次在POST编辑操作中,接受参数:

[HttpPost]
public ActionResult Edit(int id, Patient model, string returnUrl = null)

但是在此操作中,您现在将要做一些不同的事情。 通常,成功发布并保存对象或其他内容后,您可以执行以下操作:

return RedirectToAction("Index");

但是,您现在应该检查returnUrl是否具有值,如果有,则重定向到该值:

if (!string.IsNullOrEmpty(returnUrl))
{
    return Redirect(returnUrl);
}
return RedirectToAction("Index");

带有身份的MVC5示例项目有一个很好的辅助方法,它使用:

private ActionResult RedirectToLocal(string returnUrl)
{
    if (Url.IsLocalUrl(returnUrl))
    {
        return Redirect(returnUrl);
    }
    else
    {
        return RedirectToAction("Index", "Home");
    }
 }

这将进入您的控制器,并且基本上与我已经描述的相同,但有两个明显的区别:

  1. 它使用Url.IsLocalUrl来检查返回URL是否实际上是此站点上的URL。 这是一个聪明的检查,因为它最初是在URL的查询字符串中传递的,所以它是开放的,可供用户操纵。

  2. 它封装了逻辑,因此您不必记住应该如何处理。 POST成功后,您只需返回RedirectToLocal(returnUrl) ,如果设置了返回URL,则将使用它。 否则,将使用后备重定向。

这是我在一个项目中做到的:

public ActionResult Edit(int id, string returnUrl)
{
    // find the model (code not shown)
    return View(model);
}

在“ Edit视图中,您不需要执行任何特殊操作,在“发布操作”中,

[HttpPost]
public ActionResult Edit(Model model)
{
    if (ModelState.IsValid)
    {
        // save Model...    

        return Redirect(Request.Params["returnUrl"]);
        // Request.Query will work as well since it is in the querystring
        // of course you should check and validate it as well...
    }
    // else return the View as usual, not shown
}

要使用它,从页面创建“编辑”链接时,只需指定额外的returnUrl参数:

@Html.ActionLink("Edit", "Edit",
    new { controller = "YourController", 
          returnUrl = Url.Action("Index", "ThisController",) 
        })

希望能帮助到你。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM