ASP.NET MVC 4 - 控制器结束后重定向到同一页面

20

从一个页面上,我有以下内容:

@using (Html.BeginForm("AddEntry", "Configure", FormMethod.Get, new { returnUrl = this.Request.RawUrl }))
{
    @Html.TextBox("IP")
    @Html.Hidden("TypeId", 1)
    <input type="submit" value="@Resource.ButtonTitleAddComponent" />
}

所以控制器被正确调用:

public ActionResult AddEntry(string ip, int TypeId, string returnUrl)
{
    // Do some stuff

    return Redirect(returnUrl);
}
我的问题是returnUrl变成了null,因此不能重定向到调用控制器的同一页。有什么想法吗?
使用:ASP.NET MVC 4 Razor
7个回答

49

如果您需要返回到类似详细页面的内容,并带有查询返回到同一页,您也可以这样做:

return Redirect(Request.UrlReferrer.PathAndQuery);

1
我在页面“A”,从那里导航到页面“B”。 现在我刷新页面“B”。在这种情况下,Request.UrlReferrer返回“B”,但我期望的是“A”。有什么帮助吗? - Gk_999
根据您的“Post Redirect Get”策略,这可能不起作用。如果表单上存在验证错误,则“UrlReferrer”可能会成为页面本身。 - Jess

17

你可以从控制器中的Request获取引荐网址:

public ActionResult AddEntry(string ip, int TypeId, string returnUrl)
{

     // Do some stuff
     string url = this.Request.UrlReferrer.AbsolutePath;

     return Redirect(url);
}

这将会确切地将您重定向到调用的网址。


你的解决方案也非常好用。页面不需要将returnUrl传递给控制器。 - Willy
另外,Request.UrlReferrer.AbsoluteUri也可以使用。Request.UrlReferrer.AbsoluteUri和Request.UrlReferrer.AbsolutePath之间有什么区别?两者都可以使用。 - Willy
你应该小心使用它,它可能是[null](https://dev59.com/uXVC5IYBdhLWcg3w51ny)。 - Andrey Burykin
为了处理它是否为空,我只是选择了一个默认操作,如果我没有引荐人,它应该执行这个操作,这个方法非常有效。 - Robin Luiten
Request.UrlReferrer.AbsoluteUri会连接查询字符串,例如,如果第一次尝试具有yoururl.com?msg=error并且操作重复,并且此次成功,则在此视图中重定向将变为yoururl.com?msg=error?msg=success,因此我建议使用AbsolutePath。 - Diin
我花了很长时间才找到这个问题,但是这个答案对我非常有帮助。非常感谢! - Joshua K

15

你可以使用Request.QueryString方法从URL中获取一些值,例如:

@using (Html.BeginForm("AddEntry", "Configure", FormMethod.Get, null))
{
    @Html.TextBox("ip")
    @Html.Hidden("TypeId", 1)
    @Html.Hidden("returnUrl", this.Request.RawUrl)
    <input type="submit" value="@Resource.ButtonTitleAddComponent" />
}

在你的控制器中,将其作为参数接收 string returnUrl


在控制器中,参数returnUrl在此尝试中仍然为空。我的要求是:我有一个视图,其中包含指定的代码,当我将这些值提交给控制器时,我希望一旦控制器结束,它会返回到调用提交的同一页。 - Willy
此外,还要检查HTML输出,以查看视图是否使用Request.QueryString从URL获取值。 - Felipe Oriani
4
@user1624552 将那个 QueryString 替换为 this.Request.RawUrl。@FelipeOriani 要重定向的 URL 是来自请求表单的当前 URL。 - Andre Calil
正如@AndreCalil所说,应该使用this.Request.RawUrl而不是QueryString。它有效!:) 如果传递QueryString,则控制器将接收一个空字符串。此外,在Html.BeginForm的末尾不需要传递null。 - Willy
由于您回答得最快且解决方案可行,我已将您的答案选为采纳答案。此外,由于我的问题是关于传递参数以返回给调用者页面的,所以我选择了您的答案作为采纳答案。这里评论的其他解决方案也有效,也许它们更加简洁,因为不需要传递额外的参数。 - Willy

10

在您的控制器类中使用Request.UrlReferrer。无需从页面传递URL。

   public ActionResult AddEntry(string ip, int TypeId)
    {

         // Do some stuff

         return Redirect(Request.UrlReferrer.ToString());
    }

那里有一个错误!UrlReferrer是一个Uri,你应该传递一个字符串到Redirect。 - Fals
好的,我没有在电脑旁检查它,已经修复。 - Esteban Elverdin
3
不需要转换为字符串。通过执行Request.UrlReferrer.AbsoluteUri即可。 - Willy

0
@using (Html.BeginForm("AddEntry", "Configure", new { returnUrl = this.Request.RawUrl }))
{
    @Html.TextBox("IP")
    @Html.Hidden("TypeId", 1)
    <input type="submit" value="@Resource.ButtonTitleAddComponent" />
}

将你的代码改成这样。

0

我发现使用UrlReferrer很好,如果需要的话还可以添加额外的参数。

辅助方法示例:

protected RedirectResult RedirectToCurrentUri(String strQueryStringOverride = "")
{
    String strReferrer = Request.UrlReferrer.AbsoluteUri;

    if (String.IsNullOrWhiteSpace(strReferrer))
    {
        strReferrer = "/";
    }

    // Can also override referrer here for instances where page has 
    // refreshed and replaced referrer with current url.

    if (!String.IsNullOrWhiteSpace(strQueryStringOverride))
    {
        String strPath = (strReferrer ?? "").Split('?', '#')[0];

        return Redirect(strPath + strQueryStringOverride);
    }

    return Redirect(strReferrer);
}

请注意,该方法允许查询字符串覆盖。 以下是如何在任何控制器中使用此方法作为辅助方法: 重定向而不更改查询字符串(如果有):
return RedirectToCurrentUri()

示例查询字符串覆盖:

return RedirectToCurrentUri("?success=true")

-2
  1. 在类似 Edit(int? id) 的获取方法中:

    ViewBag.RefUrl = Request.UrlReferrer.ToString();
    
  2. 在视图中添加隐藏域:@Html.Hidden("RefUrl");
  3. 在提交 Edit(int id,string RefUrl) 方法时:

    return Redirect(RefUrl);
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接