4

私はプロジェクトに取り組んでおり、別の開発者がこのようなコードを持っています...

<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モバイルリストビューを台無しにしています。フォーマットはすべて奇妙です。理由はよくわかりませんが、フォームのせいだと思います。

対照的に、アンカータグを含む次のリストビューがあり、それはうまくレンダリングされます。

<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>

だから私の質問は...

別の繰り返しフォームを使用せずに、同じ機能を持つ同様のテーブル/製品のリストを作成するにはどうすればよいですか (つまり、productID をクリックし、productId を渡すコントローラーアクションに POST しますが、クエリ文字列には渡しません)。

おそらく1つのフォームだけだと思っていましたが、どういうわけか適切なproductIDがコントローラーに渡されます。このようにして、 @foreach (モデルの変数製品)の外にHtml.BeginFormを持つことができます。

私は、Web フォームの LinkBut​​ton がグリッドで行っていたものと似たようなことをしようとしていると思います。私は ActionLinks が欲しいのですが、GET ではなく POST したいのです。

どんな助けにも感謝します。

ありがとう!

4

2 に答える 2

1

あなたのコードにはいくつかの間違った点があります。ajaxを使用した代替アプローチを提案しています

1. foreach を使用して、1 つのページ内に多数のフォームを作成します。送信中は、最初のフォーム ( ) を送信していますdocument.forms[0].submit()。1人

あなたの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.それでも同じアプローチに従っている場合...アクションメソッドのパラメーターとしてクエリ文字列が必要です。それは間違っています

このように受け入れることができます。(次のスニペットusing (Html.BeginForm("SelectProduct", "Home", new {productId = product.Id}))では、追加した productId プロパティをサーバー側メソッドでクエリ文字列として受け入れることができます。)

var ProductId=HttpContext.Request.QueryString["productId"]
于 2012-10-05T08:41:07.273 に答える
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();" })
于 2012-10-05T04:04:31.623 に答える