MVC POST到控制器动作并从listview传递参数?

时间:2012-10-05 01:39:48

标签: asp.net-mvc listview post jquery-mobile

我正在处理一个项目而另一个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中没有这个数据)

但我不喜欢这个因为......

  • 它不起作用,因为它总是张贴[0]
  • 我不确定如何为每件产品创建表单
  • 我正在搞乱我的jquery mobile listview,格式化很奇怪。我不确定为什么,但是因为形式而思考。

相比之下,我有一个带有锚标签的以下列表视图,并且渲染得很好。

<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

我想我正在尝试做一些类似于LinkBut​​ton在网格中做的Web表单的事情。 这就像我想要ActionLinks,但我希望他们发布POST而不是GET。

感谢任何帮助。

谢谢!

2 个答案:

答案 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();" })