Asp.net mvc Html.begrevaluedictionary vs Html.Hidden

Asp.net mvc Html.begrevaluedictionary vs Html.Hidden,asp.net-mvc,Asp.net Mvc,下面两种将参数传递给控制器动作的方法有什么区别?我什么时候应该使用其中一种 第一种方法: @using (Html.BeginForm("ActionName", "ControllerName", new {orderId = Model.orderID, productId = Model.productID}, FormMethod.Post)) { ... } @using (Html.BeginForm("ActionName", "ControllerName", Form

下面两种将参数传递给控制器动作的方法有什么区别?我什么时候应该使用其中一种

第一种方法:

@using (Html.BeginForm("ActionName", "ControllerName", new {orderId = Model.orderID, productId = Model.productID}, FormMethod.Post))
{
    ...
}
@using (Html.BeginForm("ActionName", "ControllerName", FormMethod.Post))
{ 
    ...

    @Html.Hidden("orderId", model.orderID)
    @Html.Hidden("productID", model.productID)
}
第二种方法:

@using (Html.BeginForm("ActionName", "ControllerName", new {orderId = Model.orderID, productId = Model.productID}, FormMethod.Post))
{
    ...
}
@using (Html.BeginForm("ActionName", "ControllerName", FormMethod.Post))
{ 
    ...

    @Html.Hidden("orderId", model.orderID)
    @Html.Hidden("productID", model.productID)
}

谢谢。

如果您使用提交按钮提交表单,两种方法都是相同的

<input type="submit" value="submit" />
更新 如果使用路由值,它将成为查询参数,可在
Request.QueryString[“key”]
中使用。如果您使用隐藏输入,它将在
请求.表单[“key”]
中可用

如果提供参数,则这两个选项也可用

public ActionResult Action(string key)

第一种是使用RouteValue字典,它将把这些值添加到表单发布到的URL中。(它们将作为查询字符串值添加,除非您指定了匹配的路由规则,在该点它们将被添加为“…/orderId/productId”。)这使得参数更像


第二种方法是将输入元素添加到DOM中的表单中,然后将其作为表单数据发布到操作中。

第一种方法是使用方法重写,将值附加到表单提交url:

<form action="/ControllerName/ActionName?orderId=<Model.orderID>&productId=<Model.productID>" action="post">

可以从route Parameters集合中检索此处的参数

第二种方法只需添加两个隐藏字段,它们可以绑定到传入和传出控制器操作的模型对象。

第一种方法:

对象路由值将作为querystring发送到post控制器,如图所示:



但是,使用第二种方法,您可以从post controller的模型中获取
orderId
productID
值。

在任何情况下,这两种方法都绝对不相同。@SethMW,我更新了我的答案,我的意思是,这两种方法的值都可以从参数中检索。@Yuliam:我喜欢您的答案,但您能给我举个例子吗e我应该选择一种方法而不是另一种方法?例如在安全方面?@Alberto,正如其他人也提到的,RouteValue将成为查询字符串,在提交并返回到同一视图后,URL将有额外的查询字符串
?key=Value
,如果您觉得用户不需要查看参数,您可能需要要使用隐藏字段,URL的最大长度约为2000,而使用HTTPPOST发布的长度远大于此长度,并且可以使用web调试器工具截获这两种方法