【问题标题】:Combine controller and action parameter for ActionLink / RedirectToAction为 ActionLink / RedirectToAction 组合控制器和动作参数
【发布时间】:2015-05-01 23:30:32
【问题描述】:

我的应用程序有一个视图,该视图与位于不同控制器中的各种不同的其他视图链接。我想在这个视图中有一个“返回”按钮,它可以让用户回到上一个视图,无论是哪个视图。

为此,我向视图模型添加了一个字符串属性,我想用它来引用@Html.ActionLink 参数中的原始视图/MyController/MyAction

链接到这个视图的一些视图属于当前控制器,一些属于其他控制器。这意味着我必须将控制器和动作传递给 ActionLink。

就目前而言,我的代码如下所示:

视图模型:

public class MyViewModel
{
    public int MyData { get; set; }

    [HiddenInput]
    public string ReturnUrl { get; set; }
}

查看:

@Html.ActionLink("Back", Model.ReturnUrl)

这会产生localhost:####/CurrentController/MyController/MyAction的不良结果

当然,我总是可以在 ViewModel 上保存两个字符串(一个用于控制器,一个用于操作)并将它们分别传递给 ActionLink,但如果可能的话,我想避免这种情况。是否存在允许我使用单个返回 url 字符串而不影响控制器的 ActionLink 重载?

另外,是否有可能在控制器端实现相同的功能,f.ex。像这样:

[HttpPost]
public ActionResult DoStuff(MyViewModel model)
{
    // do stuff

    return RedirectToAction(model.ReturnUrl);
}

【问题讨论】:

  • 可能在拥有 Foo 视图的控制器中添加一个具有 JsonResult 值的属性(例如:LastCallerOfFooView),以便有一个集中的状态点来表示调用该视图的最后一个资源。
  • 我不会想太多。 ActionLink 是为超链接编写 HTML 的快捷方式,无需对控制器和操作进行硬编码。但是由于您已经知道整个 Url,因此您可以简单地使用普通的锚标记。唯一可能失败的情况是,如果您使用不同的路由方案部署了一个新网站,而用户使用过时的链接打开浏览器。

标签: c# asp.net-mvc


【解决方案1】:

您不应该使用ActionLink。只需使用锚标记,如下所示:

<a href='@Url.Content(Model.ReturnUrl)'>Back</a>

而且,在你的行动中,你可以像下面这样:

[HttpPost]
public ActionResult DoStuff(MyViewModel model)
{
    // do stuff

    return Redirect(model.ReturnUrl);
}

另外,另一种解决方案是在模型中包含两个属性(ReturnControllerReturnAction)。

【讨论】:

    猜你喜欢
    • 2011-01-27
    • 2011-12-29
    • 1970-01-01
    • 2020-10-30
    • 1970-01-01
    • 1970-01-01
    • 2013-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多