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

时间:2010-01-06 13:59:35

标签: .net asp.net-mvc-2

我正在使用带有Entity Framework v4的v2版本学习MVC。假设我有3个对象游戏,积分和玩家。它们以下列方式相关: 游戏有积分,积分可以有一个与之相关的玩家(1个游戏到多个积分,一个Point对象可以有一个玩家)。

我正在尝试使用MVC2中的EditTemplates功能来呈现我的视图。在我的游戏编辑视图中,我希望可以编辑基本的游戏对象信息,以及相关的Points对象。目前我正在使用“<%= Html.EditorForModel() %>”(这似乎很慢)来渲染编辑视图,然后我有一个特定的Game和Point EditTemplates。

数据呈现正确,并且可以对游戏和点信息进行编辑。当我去执行更新并提交表单时,我在Update ActionResult中收到“Game”对象。为Game对象填充基本属性,但不包括任何深度属性(如Points);它们显示为null。如果我在调试中查看Request.Form变量,我可以看到Points字段正在传递给服务器但不会将自己放回到Game对象中。

在我的游戏EditTemplate中,我使用以下内容来渲染Points对象:

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

My Points EditTemplate看起来像:

<%@ 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>

如何让深层属性在Controller Update ActionResult接受的Game对象中回发,以便我可以同时更新它们?

更新 这似乎与EditTemplate渲染Points集合的方式有关。如果我手动将以下内容添加到视图中,它确实在Game对象中正确显示:

<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.Go.Points [index]

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

他们必须被命名为Game.Points [0] .PntId 或者您可以将Points作为参数添加到您的操作中并将它们组合起来。特别是如果你坚持使用数据库,你必须附加它们。