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

但是,我正在使用href属性打开一个模式窗口,该窗口将使用Html.RenderAction来显示来自Book控制器的适当表单。

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

由于我需要将id传递给 RenderAction 以使 Edit 方法起作用,因此我需要在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 回答