Html.BeginForm RouteValueDictionary vs Html.Hidden

时间:2014-08-07 10:25:41

标签: asp.net-mvc

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

第一种方法:

@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)
}

感谢。

4 个答案:

答案 0 :(得分:2)

第一种方法是使用FormExtensions.BeginForm方法覆盖,它将值附加到表单提交网址:

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

可以从路线参数集合中检索此处的参数。

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

答案 1 :(得分:1)

第一个是使用RouteValue字典,它将这些值添加到表单发布到的URL。 (它们将作为查询字符串值添加,除非您指定了匹配的路径规则,此时它们将被添加为&#39; ... / orderId / productId&#39;。)这使参数更像GET

第二个将输入元素添加到DOM中的表单,然后将其作为表单数据真正POST到操作中。

答案 2 :(得分:1)

采用第一种方法:

对象路由值将作为查询字符串发布到控制器,如下所示:“

<form action="/ControllerName/ActionName?orderId=1&productID=2" method="post"></form>

但是使用第二种方法,您可以从后期控制器的模型中获取orderIdproductID值。

答案 3 :(得分:0)

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

<input type="submit" value="submit" />

但是如果您想使用AJAX提交表单,例如使用jQuery,然后序列化表单。你需要使用第二种方法。

$.ajax({
   type: "POST",
   url: '/Controller/Action',
   data: $('form').serialize()
});

更新

如果您使用路线值,它将成为查询参数,并在Request.QueryString["key"]中可用。如果您使用隐藏输入,则可在Request.Form["key"]中使用。

如果您提供参数,它们都可用。

public ActionResult Action(string key)