以下两种方法将参数传递给控制器动作的区别是什么?我什么时候应该使用其中一种?
第一种方法:
@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)
}
感谢。
答案 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>
但是使用第二种方法,您可以从后期控制器的模型中获取orderId
和productID
值。
答案 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)