我正在使用带有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]
答案 0 :(得分:1)
这显然是MVC早期版本中的一个错误。根据微软在MVC论坛上收到的评论,它看起来是在RTM版本中修复的。
我已经恢复使用for循环同时生成HTML。
以下是MVC论坛回复供参考: http://forums.asp.net/t/1515461.aspx
答案 1 :(得分:0)
他们必须被命名为Game.Points [0] .PntId 或者您可以将Points作为参数添加到您的操作中并将它们组合起来。特别是如果你坚持使用数据库,你必须附加它们。