我正在处理一个项目而另一个devloper有一些这样的代码...
<script type="text/javascript">
function submitForm() {
document.forms[0].submit();
}
</script>
@foreach (var product in Model)
{
using (Html.BeginForm("SelectProduct", "Home", new {productId = product.Id}))
{
<tr>
<td>
<a href="#" id="submit_form" onclick="submitForm();">@product.Id</a>
</td>
<td>
@product.Name
</td>
</tr>
}
}
它构建了一个包含可点击产品ID和产品名称的2列表。 单击productId
时,它会发布到主控制器上的SelectProduct操作[HttpPost]
public ActionResult SelectProduct(Guid productId)
{
...
}
我喜欢这个,因为它是一个POST并且不会在url \ querystring中发送productId。 (我改变了这个例子的代码,这些arnt确实是productIds和id更喜欢在url中没有这个数据)
但我不喜欢这个因为......
相比之下,我有一个带有锚标签的以下列表视图,并且渲染得很好。
<ul data-role="listview" data-inset="true" data-dividertheme="b">
<li><a href="@Url.Action("Index", "SomeControllerA")">Some Controller A</a> </li>
<li><a href="@Url.Action("Index", "SomeControllerB")">Some Controller B</a> </li>
<li><a href="@Url.Action("Index", "SomeControllerC")">Some Controller C</a> </li>
</ul>
所以我的问题是......
如何制作具有相同功能的类似表/产品列表(例如,在不使用单独的重复表单的情况下,单击产品ID和POST到传递productId但不在查询字符串中的控制器操作)?
我想的可能只是一个表单,但不知何故正确的productID传递给控制器。这样我就可以在 @foreach(模型中的var产品)之外拥有 Html.BeginForm 。
我想我正在尝试做一些类似于LinkButton在网格中做的Web表单的事情。 这就像我想要ActionLinks,但我希望他们发布POST而不是GET。
感谢任何帮助。
谢谢!
答案 0 :(得分:1)
您的代码a有许多错误点。我建议使用ajax的替代方法
1.使用foreach,您可以在一个页面中创建多个表单。在提交时,您正在提交第一份表格(document.forms[0].submit()
)。单独
重写你的html如下
@foreach (var product in Model)
{
<tr>
<td>
<a href="#" id="submit_form" onclick="submitForm(@product.Id);"></a>
</td>
<td>
@product.Name
</td>
</tr>
}
使用jquery对服务器进行ajax调用。
var productid;
function submitForm(productid) {
$.ajax({
type: 'GET',
url: "/Home/SelectProduct?productId="+productid,
contentType: "application/json; charset=utf-8",
success: function (_results) {
$("#resultdiv").html(_results);
},
error: function (_results) {
}
});
}
并接受productid作为查询字符串
var ProductId=HttpContext.Request.QueryString["productId"]
2.如果你遵循相同的方法,仍然...... 您希望查询字符串作为action方法中的参数。错了
你可以这样接受它。
(在以下代码段using (Html.BeginForm("SelectProduct", "Home", new {productId = product.Id}))
中,您添加的productId属性可以作为服务器端方法中的查询字符串接受。)
var ProductId=HttpContext.Request.QueryString["productId"]
答案 1 :(得分:0)
您无法使用普通链接(使用<a>
标记)进行此操作。请改用Ajax.ActionLink()
方法。 Documentaion
示例:强>
<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")" type="text/javascript"></script>
@Ajax.ActionLink("Click this link", "SelectProduct","Home", new { productId = product.Id }, new AjaxOptions { UpdateTargetId = "DivToUpdateWithResult", HttpMethod = "POST" ,OnComplete = "js_function_to_call_afterComplete();" })