0

これは、私が考えているよりもはるかに単純な問題になる可能性がありますが、ここでは...

BookManagerクラスとBookクラスがあります。BookManager には多くの本があります。これは、CodeFirst を使用して EntityFramework を介してセットアップされます。

BookManagerの[詳細]ページでは、 foreachステートメントを使用して、書籍のリストと、特定の書籍を編集するためのリンクを表示します

そのコードは次のとおりです。

@foreach (var item in Model.Books)
    {

        <tr>
           <td>
              @Html.DisplayFor(modelItem => item.BookName)
            </td>
            <td>
              @Html.DisplayFor(modelItem => item.BookNumber)
            </td>
            <td>                                   
              <a class="btn" data-toggle="modal" href="#BookEditModal" @{ViewBag.SelectedBook = item.BookID}>
              <i class="icon-edit"></i>
                 Edit       
              </a>                                

             </td>
         </tr>
      }

トリッキーな部分は次のとおりです。

<a class="btn" data-toggle="modal" href="#BookEditModal" @{ViewBag.SelectedBook = item.BookID} >
    <i class="icon-edit"></i>
       Edit       
</a>  

通常、私は次のようなことをします: href="@Url.Action("Edit", "Book", new { id = item.BookID})

ただし、Html.RenderActionを使用してBookコントローラーからの適切なフォームを表示するモーダル ウィンドウを開くには、 href属性を使用しています。

以下は、BookManager の詳細ページの下部に含まれるモーダル ウィンドウです。

 <div class="modal hide fade in" id="BookEditModal" )>
          <div class="modal-header">
            <button type="button" class="close" data-dismiss="modal">×</button>
            <h3>Edit Book</h3>
          </div>
          @using (Html.BeginForm("Edit", "Book", FormMethod.Post))
          {
             <div class="modal-body">
               @{ Html.RenderAction("Edit", "Book", new { id = ViewBag.SelectedBook}); }
             </div>

          }
        </div>

Edit メソッドを機能させるにはIDを RenderAction に渡す必要があるため、 foreachでクリックされた項目の値が必要ですが、それはもはやスコープ外です。

BookManager の Details メソッド内で ViewBag.SelectedBook を作成しようとしましたが、値が選択された本ではなく、代わりに foreach ステートメントがループし、値が本数になりますViewBag.SelectedBook。(例: リストに 3 つの本がある場合、ViewBag.SelectedBook は 3 に等しい)。

私は JQuery を使用して、クリックされた項目で$(this)を呼び出すことを考えましたが、Javascript で BookID を収集し、それを C# に変換して Html.RenderAction で収集する必要があります。私がやろうとしていること。

クリックされたアイテムの値を収集し、それをモーダルにあるHtml.RenderActionに渡すにはどうすればよいですか?

ありがとう!

4

1 に答える 1

3

他に方法はありません。

つまり、サーバー側のコードをクライアント側のスクリプトと相互作用させようとしているということです。

モーダルダイアログはページのレンダリング時にレンダリングされるため、試行しているものは機能しません。

私の提案は、おそらく次のように、コントローラーアクションを介してモーダルダイアログ全体をロードすることです。

次のように、foreachリンクを生成します。

<a class="btn edit-book-link" data-toggle="modal" href="/ControllerName/BookForm/@item.BookID">

..次のように、モーダルダイアログのdivを空白にします。

<div class="modal hide fade in" id="BookEditModal" )>
    <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal">×</button>
        <h3>Edit Book</h3>
    </div>
    <div id="modalContent"></div>
</div>

たとえば、BookFormと呼ばれる、モデルとして整数をとるビューを作成します。

[HttpGet]
public ViewResult BookForm(int id) {
    return View(id);
}

..次に、jQueryを使用して、クリックするたびに正しいフォームを読み込みます。

$(function () {
    $('.edit-book-link').click(function (e) {
        $('#modalContent').load($(this).attr('href'), function() {
            // show your modal dialog here using whatever method you use..
        });
        e.preventDefault();
        return false;
    });
});

次に、BookFormビューで、IDを使用してフォームを生成できます。

うまくいけば、私はあなたの問題を正しく理解しました。

于 2012-08-01T00:58:29.427 に答える