【问题标题】:ASP.NET MVC2 and EF4 - Creating checked checkboxes in an Edit viewASP.NET MVC2 和 EF4 - 在编辑视图中创建选中的复选框
【发布时间】:2010-10-25 10:25:38
【问题描述】:

我目前正在为我的游戏评论项目创建共享编辑/创建视图,但遇到了问题。每个游戏都可以是各种平台上的标题。我在我的 EF4 模型中将此映射为多对多关系。对于我的观点,我希望有一系列带有每个平台名称的复选框,并且对于编辑视图,选中正确的框。

我可以使用 HTML 助手轻松创建复选框。我最大的问题是弄清楚如何告诉助手在正确的平台值上打开 isChecked。到目前为止,这是我所拥有的:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<HandiGamer.ViewModels.AdminGameReviewViewModel>" %>

<p>
    <%: Html.LabelFor(model => model.GameData.GameTitle) %>
    <%: Html.TextBoxFor(model => model.GameData.GameTitle) %>
    <%: Html.ValidationMessageFor(model => model.GameData.GameTitle) %>
</p>
<p>
    <%: Html.LabelFor(model => model.Genres) %>
    <%: Html.DropDownList("Genre", new SelectList(ViewData["Genres"] as IEnumerable, "GenreID", "Name", Model.GameData.GenreID) %>
</p>
<p>
    <%: Html.LabelFor(model => model.Platforms) %>
    <% foreach(var item in Model.Platforms) { %>
        <%: Html.CheckBox(item.Name) %>
    <% } %>
</p>

而且,我的视图模型是:

public class AdminGameReviewViewModel
{
    public Game GameData { get; set; }
    public List<Genre> Genres { get; set; }
    public List<Platform> Platforms { get; set; }
}

填充者:

    public ActionResult EditReview(int id)
    {
        var game = _siteDB.Games.Include("Genre").Include("Platforms").Include("Content").Single(g => g.GameID == id);
        var genres = _siteDB.Genres.ToList();
        var platforms = _siteDB.Platforms.ToList();
        var model = new { GameData = game, Genres = genres, Platforms = platforms }; 

        return View(model);
    }

所以,我真的只需要用逻辑推动正确的方向来确定应该选中哪些框。

谢谢。

【问题讨论】:

    标签: asp.net-mvc-2 entity-framework-4 views


    【解决方案1】:

    尝试使用Html.CheckBoxFor

    谓词是绑定到字段的表达式(应该是布尔值)。

    <%: Html.CheckBoxFor(item => item.Name) %>
    

    另外,我注意到在你的控制器中你返回了一个匿名类型 - 应该是强类型到你的 AdminGameReviewViewModel 视图模型,否则模型绑定将不起作用。

    例如:

    var model = new AdminGameReviewViewModel { GameData = game, Genres = genres, Platforms = platforms }; 
    

    我不确定你想要复选框的模型属性。你确定一个项目可以/不能有名称吗?听起来 item.Name 是一个字符串,对复选框无效 - 您应该绑定到布尔标志。

    也许您应该向 ViewModel 添加另一个属性?

    【讨论】:

    • 我的部分问题是我不熟悉 MVC 绑定和表单创建。平台与游戏共享多对多关系,但唯一链接它们的是数据透视表,这在我的 EF4 模型中实际上是不可见的。我必须有一个所有可用平台的列表,这就是我的视图模型中的平台,但我只是不知道如何将我的 GameData 的实际平台映射到平台的整体列表。即使我向视图模型添加另一个属性,问题仍然存在 - 不知道如何在列表中的正确平台上设置 isChecked。
    • 是的,我在我的 EF4 模型中有一个类似的设置(隐藏连接故事以适应多对多)。当您说“不知道如何在列表中的正确平台上设置 isChecked ”时,您是什么意思?你在“检查”什么价值?请记住 - 复选框代表真/假值。您是说希望能够在他们取消选中该框时删除与特定平台的关联?
    • 是,或者在所有可用平台列表中设置与不同平台的新关联。因此,如果选中 PS3,我应该能够将其删除和/或检查 XBox 360。
    • 嗯,是的,这很棘手。复选框与模型属性没有 1-1 绑定(模型绑定通常是这种情况)。我认为这需要手动进行 - 当您提交表单时,您需要将选中的项目与 ViewModel 中的“启用”平台进行比较,然后对于未选中的项目,将其从平台的集合中删除。不过,这对我来说似乎不太好,我认为您不应该允许通过复选框“删除”平台,它应该更加明确。 (即每个平台旁边的删除按钮)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-22
    • 1970-01-01
    • 2016-11-28
    相关资源
    最近更新 更多