Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 MVC3 Html.BeginForm-在RouteValueDictionary失败时传递参数_Asp.net Mvc 3_Html Helper - Fatal编程技术网

Asp.net mvc 3 MVC3 Html.BeginForm-在RouteValueDictionary失败时传递参数

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

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

@使用(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#规范中了解更多信息: