代码之家  ›  专栏  ›  技术社区  ›  Jay

使用MVC2编辑模板和相关对象

  •  2
  • Jay  · 技术社区  · 15 年前

    我正在学习MVC,使用的是带有实体框架v4的v2版本。假设我有3个对象游戏,点数和玩家。它们的关联方式如下: 游戏有点数,并且点数可以有一个与之关联的玩家(1个游戏到多个点数,一个点对象可以有一个玩家)。

    我正在尝试使用MVC2中的EditTemplates功能来呈现我的视图。在我的游戏编辑视图中,我希望可以编辑基本的游戏对象信息,以及相关的点对象。目前我正在使用__ <%= Html.EditorForModel() %> _(看起来很慢)呈现编辑视图,然后我有一个特定的游戏和点编辑模板。

    数据呈现正确,可编辑游戏和点信息。当我执行更新并提交表单时,我会在更新操作结果中收到__game_157;对象。为游戏对象填充基本属性,但任何深度属性(如点)都不会填充;它们显示为空。如果我在debug中查看request.form变量,我可以看到points字段正在被传递到服务器,但不将它们放回游戏对象中。

    在我的游戏编辑器模板中,我使用以下方法渲染点对象:

    <%= Html.EditorFor(c => c.Points) %>
    

    我的Points编辑模板如下:

    <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Domain.Model.Entities.Point>" %>
    
    <%= Html.EditorFor(c => c.PntId)%>
    <tr><td><%= Html.DisplayFor(c => c.User.Username)%></td><td><%= Html.EditorFor(c => c.UserPnt)%></td></tr>
    

    呈现的HTML如下所示:

    <input id="Points_Points_0__PntId" name="Points.Points[0].PntId" type="hidden" value="226" />
    <tr><td>Jay</td><td><input class="text-box single-line" id="Points_Points_0__UserPnts" name="Points.Points[0].UserPnts" type="text" value="20" /></td></tr>
    
    <input id="Points_Points_1__PntId" name="Points.Points[1].PntId" type="hidden" value="227" />
    <tr><td>Joe</td><td><input class="text-box single-line" id="Points_Points_1__UserPnts" name="Points.Points[1].UserPnts" type="text" value="20" /></td></tr>
    

    我如何才能让深度属性在控制器更新actionresult接受的游戏对象中发布,以便我可以同时更新它们?

    更新: 这显然是EditTemplate呈现点集合方式的问题。如果我手动将以下内容添加到视图中,它会正确显示在游戏对象中:

    <input class="text-box single-line" id="Game_Points_0__UserPnts" name="Game.Points[0].UserPnts" type="text" value="20" />
            <input class="text-box single-line" id="Game_Points_1__UserPnts" name="Game.Points[1].UserPnts" type="text" value="20" />
    

    你知道为什么呈现为“points.points[index]而不是game.points[index]吗?我试着弄乱editfor中的参数:

    <%= Html.EditorFor(c => c.Points,null,"Game.Points") %>
    

    但是输入结果呈现为game.points.game.points[索引]

    2 回复  |  直到 15 年前
        1
  •  1
  •   Jay    15 年前

    这显然是MVC早期版本中的一个错误。根据我在MVC论坛上从微软收到的评论,它看起来是在RTM版本中修复的。

    我已经恢复使用for循环在同一时间内生成HTML。

    以下是MVC论坛的回复供参考: http://forums.asp.net/t/1515461.aspx

        2
  •  0
  •   Alexander Taran    15 年前

    必须命名为game.points[0].pntid 或者,您可以将点作为参数添加到操作中,并在操作中组合它们。特别是如果你将它们保存在数据库中,你必须附加它们。