0

MVC4 を使用して、ユーザー アカウントを一覧表示するグリッドでユーザーがクリックできる「ロック」/「ロック解除」ボタン/リンクを作成しようとしています。WebForms では、列のグリッド テンプレートに ImageButton を配置し、それをそのボタンの Command イベントに接続してから、そのユーザーに対して表示される「ロック」/「ロック解除」テキストを変更するという比較的単純なタスクです。しかし、MVC4でこれを行う方法を完全に理解できないようです。または、少なくとも ajax/jquery をグリッド内の各ユーザーとうまく連携させるために、かなりの数のフープを飛び越えなければなりません。

現在、システムに登録されているユーザーを一覧表示するグリッドがあり、このグリッドは正しく表示されています。グリッドは単純なビューで表示され、コントローラーは のプロパティを持つモデルを返しますUsers。このプロパティは、UserInfoUserName、Name、IsActive などの基本的なユーザーの詳細を含むオブジェクトのリストです。

Html.RenderAction を使用して、タスクを実行する Lock という専用のアクションを呼び出してみましたが、ユーザーの詳細をコントローラーに渡そうとするとエラーが発生し続けました ( ASP.NET MVC 2 では、ルート値を取得するにはどうすればよいですか現在のリンクを強調表示できるように、ナビゲーション コントローラーを使用しますか? - うまくいきませんでした)。

同様に、部分ビューを作成しようとしましたが、エラーが発生し続けました( Html.RenderPartial で奇妙なオーバーロードエラーが発生しましたか?いいえ、私にとってもうまくいきませんでした)。

私は、これらの個々の問題と、今日やりたいことを実行するための代替方法を調査するために SO を探し回っていますが、このタスクを成功させるにはほど遠い.

私が説明したことを行う簡単な方法はありますか?jquery 関数をアタッチするために、ユーザー行ごとに個別に番号付けされた要素タグを書き出す必要がありますか?

UPDATE グリッドを生成するコード。

if (Model != null && Model.Users != null && Model.Users.Count > 0)
{
    <table class="table table-striped">
        <tr>
            <th>
                User
            </th>
            <th>
                Name
            </th>
            <th>
                Lock/Unlock
            </th>
        </tr>
        @foreach (UserInfoModel user in Model.Users)
        {
            <tr>
                <td>
                    @Html.ActionLink(user.UserName, "Edit", new { id = user.PersonID })
                </td>
                <td>
                    @Html.DisplayFor(m => user.Name)
                </td>
                <td>
                    @*@Html.Action("Lock", new { personID = user.PersonID, isLocked = null as bool?})*@
                    @*@{ Html.Render("_Lock", new { personID = user.PersonID, isLocked = null as bool? }); }*@
                    @Html.ActionLink("Lock", "Lock", new { personID = user.PersonID, lockAccount = user.IsActive })
                </td>
            </tr>
        }
    </table>

コントローラー コードの試み。

[Authorize(Roles = LMSRoles.Administrators)]
public ActionResult Lock(int personID, bool lockAccount)
{
    return Json(null, JsonRequestBehavior.AllowGet);// PartialView("_Lock");
}
4

1 に答える 1

1

あなたのコードは問題ないようです。リンクをクリックするとすぐLockに、アクションにリダイレクトされLockます (ユーザーがロールで承認されている場合Administrators)。

あなたはむしろajaxリクエストをしたいようです。その場合、jquery以前のコメントで述べたように使用することを好みます。

ActionLinkこれを行うには、次のように変更します。

@Html.ActionLink("Lock", "Lock", 
     new { personID = user.PersonID, lockAccount = user.IsActive }, 
     new { @class="lock" }) // Add a dummy css class 'lock'

以下のスクリプトを、ドキュメントの readyイベント ハンドラー内に記述します。

// Register click handler for any element with the class 'lock' (works only if the element an 'a' tag).
$('.lock').click(function (e) {
    // Prevent the default functionality.
    e.preventDefault();

    // Do the get ajax request (you can do post as well, but not required in this case).
    $.ajax({
        type: "GET",
        url: $(this).attr('href'), // Take the URL from link's href
        contentType: 'application/json',
        async: true,
        beforeSend: function () {
            // Display loading image
        },
        success: function (result) {
            // Handle the response here. Ex: Inform the user that, lock operation is succeeded.
        },
        complete: function () {
            // Hide loading image.
        },
        error: function (jqXHR, textStatus, errorThrown) {
            // Handle error.
        }
    });

});

コードはシンプルで一目瞭然ですが、まだ詳細なコメントを付けていjqueryます。

jqueryPS:このスクリプトを使用する前に、ファイルを含めることを忘れないでください。

于 2013-09-12T18:22:18.087 に答える