ASP.NET C#MVC - 捕获foreach&中项目的值传递给莫代尔

时间:2012-07-31 23:51:43

标签: c# asp.net-mvc asp.net-mvc-3

这可能最终会成为一个比我要成功的问题更简单的问题,但是这里有......

我有一个 BookManager 类和一个 Book 类。 BookManager有很多书 - 这是使用CodeFirst通过EntityFramework设置的。

在BookManager的详细信息页面中,我使用 foreach 语句显示图书列表以及指向<的链接strong>编辑特定的书。

这是代码:

@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 <的相应表单/ strong>控制器。

以下是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

谢谢!

1 个答案:

答案 0 :(得分: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生成表单。

希望我能正确理解你的问题。