【问题标题】:How can I return a view(model) and also pass a query string param to the view?如何返回视图(模型)并将查询字符串参数传递给视图?
【发布时间】:2013-05-29 14:47:02
【问题描述】:

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

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

【问题讨论】:

  • 你不能将它保存在会话变量中吗?当用户单击“修改”时将变量设置为 true,并在用户完成表单时将其设置为 false。
  • 好吧,我正在使用带有 url 字符串参数的操作链接让它们回到第 1 步。一旦重定向到第 1 步,我就可以在会话中设置它,但如果可以的话,它看起来会更干净只是继续传递该网址。
  • 用户是经过身份验证的还是匿名的?当用户回来时,是否应该填写表格?还是用户每次[他登录]时都会填写表格?

标签: asp.net-mvc asp.net-mvc-routing


【解决方案1】:

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

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))
{
    ...
}

【讨论】:

  • 可行,但我如何将对象 htmlAttributes 添加到此方法中? public static IDisposable BeginRequestForm(this HtmlHelper html, string action, string controller, FormMethod method, object htmlAttributes)
  • 我刚刚发现 builder.MergeAttributes(new RouteValueDictionary(htmlAttributes),true);
【解决方案2】:

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

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

那么在你看来:

Html.BeginForm("MyAction", "MyController", new { modify = ViewBag.modify })

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多