Asp.net mvc 3 MVC3 Html.BeginForm-在RouteValueDictionary失败时传递参数
我有一个多步骤的设置过程,在这个过程中,我希望只在相关的情况下传递附加到URL的查询字符串参数Asp.net mvc 3 MVC3 Html.BeginForm-在RouteValueDictionary失败时传递参数,asp.net-mvc-3,html-helper,Asp.net Mvc 3,Html Helper,我有一个多步骤的设置过程,在这个过程中,我希望只在相关的情况下传递附加到URL的查询字符串参数 @使用(Html.BeginForm()) 工作得很好。它产生:即,它将任何原始查询字符串参数传递到POST操作中,然后在该控制器操作中,我可以通过添加到RouteValue和RedirectToResult来选择哪些参数与传递到下一步相关,或者需要添加 但是,出于样式的目的,我需要为表单指定一个类 我试过: @使用(Html.BeginForm(“Profile”,“Account”,args,F
@使用(Html.BeginForm())
工作得很好。它产生:
即,它将任何原始查询字符串参数传递到POST操作中,然后在该控制器操作中,我可以通过添加到RouteValue和RedirectToResult来选择哪些参数与传递到下一步相关,或者需要添加
但是,出于样式的目的,我需要为表单指定一个类
我试过:
@使用(Html.BeginForm(“Profile”,“Account”,args,FormMethod.Post,new{@class=“mainForm”}))
这将产生:
(args
由筛选器生成,是RouteValueDictionary)。该规范指示您可以使用System.Web.Routing.RouteValueDictionary传递参数
我想要的是
我应该提到,我不想做像传入new{key=value}
这样的事情,因为有相当多的逻辑来决定我将传递到下一步的内容
有什么建议吗
我被这项看似简单的任务所困扰,我肯定错过了一些非常明显的东西 只是一个想法,但是,即使是多步骤表单,您不想选择全部获取还是发布吗?在上面的例子中。。。看起来您正在将POST与表单一起使用。。。但仍在尝试使用“继续前进” 为什么不直接使用隐藏的POST值(使用HTML输入)呢
否则,用户可以更轻松地更改值,对吗?(不过,这在本应用程序中可能并不重要。这主要是值得思考的。)因此,您正在使用此重载: 是否可以使args成为具有键和值的简单对象?我想这可能会解决你的问题 根据文件: 通过检查对象的属性,通过反射检索参数。此对象通常使用对象初始值设定项语法创建。-这似乎就是正在发生的事情——它使用反射来获取路由字典的属性——属性是键(字符串的集合)和值(对象的集合) 另一种选择是不使用html帮助程序并手动创建表单标记——尽管这会有点违背使用html帮助程序的目的
@using (Html.BeginForm("Profile", "Account", new { id=122}, FormMethod.Post, new { @class = "mainForm" }))
路由值由对象初始化语法创建,即new{key=value}
args由筛选器生成,是RouteValueDictionary
这是这里的关键点。在这种情况下,请确保您正在使用BeginForm方法:
@using(Html.BeginForm(
"Profile",
"Account",
args,
FormMethod.Post,
new RouteValueDictionary(new { @class = "mainForm" })
))
{
...
}
注意最后一个论点?它必须是IDictionary
,才能正常工作
在您的示例中,它是被拾取的。但是,由于为routeValues参数传递的是RouteValueDictionary
,而不是匿名对象,因此它会出错
因此,您应该将routeValues和htmlAttributes都作为字典或都作为匿名对象。我应该提到我不希望直接使用对象初始化语法,即new{key=value},因为在我的代码中需要一点逻辑来确定我想要传递什么。我应该在我的帖子前面提到-需要一点逻辑来确定我到底想要保留/清理/添加到参数中的内容。也许我应该追求一个定制的HtmlHelper?我不确定定制的HtmlHelper在这里给你买了什么——逻辑必须要走到某个地方。也许其他帖子中的答案可能会有所帮助@Darin Dimitrov你能检查一下我的问题吗?有一些相似之处:你的解决方案适合我的情况,但我不明白为什么在类变量之前使用@符号。有人能解释一下这是怎么回事吗?谢谢。@northben,之所以使用它是因为
class
是C#中的保留关键字。您可以在C#规范中了解更多信息: