【问题标题】:ReturnUrl from Form in ASP.NET MVC3ReturnUrl 来自 ASP.NET MVC3 中的表单
【发布时间】:2012-04-30 07:02:08
【问题描述】:

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

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

【问题讨论】:

  • 能发一下action方法的源码吗?

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


【解决方案1】:

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

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");

【讨论】:

    【解决方案2】:

    像这样?

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

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

    【讨论】:

    • 由于某种原因,这也不能正确保存表单。有趣的是,当我这样做 Html.BeginForm("act","contr",FormMethod.Post, new {returnUrl = retUrl}) 时,它保存了表单并重定向,但它重定向到另一个错误的页面。
    • 为什么{returnUrl = retUrl} 而不是让视图脱离上下文?这会产生相同的结果吗?
    【解决方案3】:

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

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

    编辑:

    您也可以使用 Html 帮助程序。

    @Html.Hidden("returnUrl", retUrl)
    

    【讨论】:

    • 我对此寄予厚望,但不幸的是它不再正确保存表单。我怀疑它与与动作参数冲突的模型有关。
    • 在浏览器中呈现的表单上的 action 属性是什么?也许您仍然没有发布到正确的控制器/动作?
    • 是的。我深信这是我的观点给我带来的问题,我完全没有看到自己在行动中犯的愚蠢错误。我想,数小时的编程有时会产生这种影响。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-25
    相关资源
    最近更新 更多