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

Eri*_*ica 7 html-helper asp.net-mvc-3

我有一个多步骤的设置过程,我想传递附加到URL的查询字符串参数,只要它们是相关的.

HTTP://本地主机:6618 /帐号/配置文件向导=真猫=狗

@using( Html.BeginForm() )

工作得很好.它产生了:<form action="/Account/Profile?setup=true&amp;cats=dogs" method="post">即它将任何原始查询字符串参数传递给POST操作,然后在该Controller操作中,我可以通过添加到RouteValues和a来选择哪些相关的传递到我的下一步,或者必须添加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},因为有相当多的逻辑来确定我将传递给下一步的内容.

关于该做什么的任何建议?

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

Dar*_*rov 11

args由过滤器生成,是RouteValueDictionary

这是关键点.在这种情况下,请确保使用BeginForm方法的正确重载:

@using(Html.BeginForm(
    "Profile", 
    "Account",   
    args, 
    FormMethod.Post, 
    new RouteValueDictionary(new { @class = "mainForm" })
))
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

注意最后一个参数?它必须是一个IDictionary<string, object>工作.

在你的例子中,这个重载是被拾取的.但是,由于您传递的RouteValueDictionary是routeValues参数而不是匿名对象,因此它会搞砸.

因此,您应该将routeValues和htmlAttributes都作为字典或两者作为匿名对象.