来自ASP.NET MVC3中Form的ReturnUrl

时间:2012-04-18 19:33:50

标签: c# asp.net-mvc-3 redirect

我做了一些研究,发现我可以使用:

string retUrl = "";
    if (ViewContext.HttpContext.Request.UrlReferrer != null)
    {
        retUrl =
          ViewContext.HttpContext.Request.UrlReferrer.PathAndQuery;
    }

作为设置returnUrl的方法,然后通过操作链接将其传递给控制器​​。

但是,有什么办法可以将表格中的参数传递给控制器​​吗?

以下是我的代码现在的样子:

@using (Html.BeginForm(new { returnUrl = retUrl})) {
    @Html.EditorForModel()
    <input type="submit" value="Save"/>
}

在提交表单时,它会返回正确的URL,因此效果很好。但是,表单实际上并未保存。如果我删除了returnUrl参数,它会保存表单但不会正确重定向。

我之所以这样做是因为这个表单可以从多个页面访问,我不希望在提交表单后将它们全部发送到一个页面,而是发送到上一页。

编辑

我也尝试过BeginRouteForm并指定一个控制器和动作,两种方法都不起作用。

修改

行动来源:

[Authorize]
        [HttpPost]
        public ActionResult EditReview(Review review, string returnUrl)
        {
            if (ModelState.IsValid)
            {
                if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
                            && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
                {
                    return Redirect(returnUrl);
                }
                reviewRepository.SaveReview(review);
                return RedirectToAction("Index");
            }
            return View(review);
        }

3 个答案:

答案 0 :(得分:4)

要在重定向之前保存表单,您需要在操作方法中切换一些行。而不是:

if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
     && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
{
  return Redirect(returnUrl);
}
reviewRepository.SaveReview(review);
return RedirectToAction("Index");

reviewRepository.SaveReview(review);
if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
     && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
{
  return Redirect(returnUrl);
}
return RedirectToAction("Index");

答案 1 :(得分:1)

喜欢这个吗?

@using(Html.BeginForm("act","contr",FormMethod.Post) {
            @Html.Hidden("returnUrl",ViewContext.HttpContext.Request.Url.PathAndQuery)
            <input type="submit" />
        }

在BeginForm方法中传递相同内容应该没有任何问题 - 要么绑定到ActionMethod(string returnUrl)

答案 2 :(得分:1)

如果我正确理解你,你实际上正在改变表单上的ACTION方法,所以我并不感到惊讶它没有保存。我会摆脱它,只是按照你原先的意图发布到控制器/动作。然后将retUrl添加为隐藏输入以与其余表单数据一起发布。

@using (Html.BeginForm()) {
    @Html.EditorForModel()
    <input type="hidden" name="returnUrl" value="@retUrl" /> 
    <input type="submit" value="Save"/>
    } 

修改

您也可以使用Html助手。

@Html.Hidden("returnUrl", retUrl)