我有一个多步骤设置过程,我希望只有在相关的情况下才会传递附加到URL的查询字符串参数。
http://localhost:6618/Account/Profile?wizard=true&cats=dogs
@using( Html.BeginForm() )
工作得很好。它产生了:<form action="/Account/Profile?setup=true&cats=dogs" method="post">
即它将任何原始查询字符串参数传递给POST操作,然后在该Controller操作中我可以选择哪些相关的传递到我的下一步,或者需要添加,通过添加到RouteValues和RedirectToResult。
但是,为了造型,我需要为表单指定一个类。
我试过了:
@using( Html.BeginForm( "Profile", "Account", args, FormMethod.Post, new { @class = "mainForm" } ) )
产生:
<form action="/Account/Profile?Count=1&Keys=System.Collections.Generic.Dictionary%602%2BKeyCollection%5BSystem.String%2CSystem.Object%5D&Values=System.Collections.Generic.Dictionary%602%2BValueCollection%5BSystem.String%2CSystem.Object%5D" class="mainForm" method="post">
(args
由过滤器生成,是RouteValueDictionary)。规范http://msdn.microsoft.com/en-us/library/dd505151.aspx表示您可以使用System.Web.Routing.RouteValueDictionary传递参数。
我想要的是<form action="/Account/Profile?setup=true&cats=dogs" class="mainForm" method="post">
我应该提一下,我宁愿不做像传递new {key = value}
这样的事情,因为有相当多的逻辑来确定我将传递给下一步的内容。
有关该怎么做的任何建议?
我被这个看似简单的任务所困扰,我肯定错过了一些非常明显的东西。
答案 0 :(得分:11)
args由过滤器生成,是RouteValueDictionary
这是关键点。在这种情况下,请确保使用BeginForm方法的correct overload:
@using(Html.BeginForm(
"Profile",
"Account",
args,
FormMethod.Post,
new RouteValueDictionary(new { @class = "mainForm" })
))
{
...
}
注意最后一个参数?它必须是IDictionary<string, object>
才能发挥作用。
在您的示例中,this overload被拾取。但是,由于您为routeValues参数传递RouteValueDictionary
而不是匿名对象,因此它会搞砸。
因此,您应该将routeValues和htmlAttributes都作为字典或两者作为匿名对象。
答案 1 :(得分:4)
以下工作。
@using (Html.BeginForm("Profile", "Account", new { id=122}, FormMethod.Post, new { @class = "mainForm" }))
路由值由对象初始化语法创建,即new {key = value}
答案 2 :(得分:0)
只是一个想法,但是,即使是一个多步形式,你不想要选择全部GET或POST吗?在上面的示例中...看起来您正在使用带有表单的POST ...但仍然在尝试使用GET。
为什么不沿途使用隐藏的POST值(使用HTML INPUT)?
否则,用户可以更轻松地更改值,对吧? (尽管在这个应用程序中这可能并不重要。这主要是思考的食物。)
答案 3 :(得分:0)
所以你正在使用这个重载:
http://msdn.microsoft.com/en-us/library/dd460542.aspx
是否可以使用键和值使args成为一个简单的对象?我想这可能会解决你的问题。
根据文件:
通过检查对象的属性,通过反射检索参数。此对象通常使用对象初始化程序语法创建。 - 这似乎正在发生 - 它使用反射来获取路径字典的属性 - 属性是键(字符串的集合)和值(集合的对象)
另一种选择是不使用html助手并手动创建表单标签 - 尽管这会破坏拥有html助手的目的。