我有一个MVC应用程序,用户填写一个4步表单然后转到“确认”屏幕。在确认屏幕上,如果他们选择修改他们的信息,我使用RedirectToAction将他们带回第一步视图,并传递一个URL参数“modify = true”,它告诉控制器使用已创建的会话对象而不是从数据库创建一个新对象并显示一个空表单。但是一旦他们提交了第1步的表单,我想将它们从我的控制器发送到第2步视图以及“modify = true”参数。似乎没有办法将视图模型返回到视图并传递查询字符串参数。我怎样才能做到这一点? 我曾考虑在视图模型中添加一个bool来表示“inReview”,但我为每个视图使用不同的视图模型,它们都非常干净,看起来这个bool会让事情变得有点麻烦。
我还考虑过将bool添加到viewbag或viewdata,但之后我会使用提交按钮传递该值,并且“modify = true”参数将丢弃该URL,可能会使用户感到困惑并且绝对令人困惑代码。 感谢
答案 0 :(得分:3)
如果使用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))
{
...
}
答案 1 :(得分:1)
您可以使用ViewBag
或您的视图模型。您只需要以某种方式将值传递给视图:
ViewBag.modify = true;
return View(model);
然后在你看来:
Html.BeginForm("MyAction", "MyController", new { modify = ViewBag.modify })