MVC3 Html.BeginForm - 在RouteValueDictionary失败时传递参数

时间:2012-01-27 02:28:44

标签: asp.net-mvc-3 html-helper

我有一个多步骤设置过程,我希望只有在相关的情况下才会传递附加到URL的查询字符串参数。

http://localhost:6618/Account/Profile?wizard=true&cats=dogs

@using( Html.BeginForm() )

工作得很好。它产生了:<form action="/Account/Profile?setup=true&amp;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&amp;Keys=System.Collections.Generic.Dictionary%602%2BKeyCollection%5BSystem.String%2CSystem.Object%5D&amp;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&amp;cats=dogs" class="mainForm" method="post">

我应该提一下,我宁愿不做像传递new {key = value}这样的事情,因为有相当多的逻辑来确定我将传递给下一步的内容。

有关该怎么做的任何建议?

我被这个看似简单的任务所困扰,我肯定错过了一些非常明显的东西。

4 个答案:

答案 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助手的目的。