1

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

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);
        }
4

3 回答 3

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");
于 2012-04-18T19:54:16.710 回答
1

像这样?

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

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

于 2012-04-18T19:44:50.607 回答
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)
于 2012-04-18T19:46:47.570 回答