1

我有一个 MVC 应用程序,用户在其中填写 4 步表单,然后转到“确认”屏幕。在确认屏幕上,如果他们选择修改他们的信息,我使用 RedirectToAction 将他们带回第一步视图,并传递一个 URL 参数“modify=true”,它告诉控制器使用已经创建的会话对象而不是从数据库创建一个新对象并显示一个空表单。但是,一旦他们提交了第 1 步的表单,我想将它们与“modify=true”参数一起从我的控制器发送到第 2 步视图。似乎没有办法将视图模型返回到视图并传递查询字符串参数。我怎样才能做到这一点?
我曾考虑在视图模型中添加一个布尔值来表示“inReview”,但我为每个视图使用不同的视图模型,它们都非常干净,看起来这个布尔值会使事情变得有点混乱。

我还考虑将 bool 添加到 viewbag 或 viewdata,但随后我将使用提交按钮来传递该值,并且“modify=true”参数会丢弃 URL,可能会混淆用户并且肯定会混淆代码。谢谢

4

2 回答 2

3

如果您使用Html.BeginForm()帮助器(不带参数),它会自动将现有的查询字符串参数附加到生成的表单action属性中。如果您使用其他一些重载,例如Html.BeginForm("SomeAction", "SomeController", FormMethod.Post)then 您将丢失这些参数。这可以通过编写一个考虑这些参数的自定义帮助程序来轻松解决:

public static class HtmlHelpers
{
    public static IDisposable BeginRequestForm(this HtmlHelper html, string action, string controller, FormMethod method)
    {
        var builder = new TagBuilder("form");
        var urlHelper = new UrlHelper(html.ViewContext.RequestContext);

        var routeValues = new RouteValueDictionary();
        var query = html.ViewContext.HttpContext.Request.QueryString;
        foreach (string key in query)
        {
            routeValues[key] = query[key];
        }

        builder.MergeAttribute("action", urlHelper.Action(action, controller, routeValues));
        builder.MergeAttribute("method", HtmlHelper.GetFormMethodString(method), true);
        html.ViewContext.Writer.Write(builder.ToString(TagRenderMode.StartTag));
        return new MvcForm(html.ViewContext);
    }
}

然后在您的视图中使用(当然在将其纳入范围之后):

@using (Html.BeginRequestForm("SomeAction", "SomeController", FormMethod.Post))
{
    ...
}
于 2013-05-29T14:54:46.080 回答
1

您可以使用ViewBag或您的视图模型。您只需要以某种方式将值传递给视图:

ViewBag.modify = true;
return View(model);

那么在你看来:

Html.BeginForm("MyAction", "MyController", new { modify = ViewBag.modify })
于 2013-05-29T15:10:50.923 回答