Asp.net mvc 2 MVC2模型绑定w/多对多:在尖端
我离创建表单工作还有一英寸远。我的问题是,在视图模型中传递到表单中的某些数据在回发时没有被发送回 型号:Asp.net mvc 2 MVC2模型绑定w/多对多:在尖端,asp.net-mvc-2,data-binding,Asp.net Mvc 2,Data Binding,我离创建表单工作还有一英寸远。我的问题是,在视图模型中传递到表单中的某些数据在回发时没有被发送回 型号: Game: GameID - int (primary key, auto-incr) GameTitle - nvarchar(100) ReviewText - text ReviewScore - smallint Pros - text Cons - text LastModified - Datetime GenreI
Game:
GameID - int (primary key, auto-incr)
GameTitle - nvarchar(100)
ReviewText - text
ReviewScore - smallint
Pros - text
Cons - text
LastModified - Datetime
GenreID - int (foreign key from Genres)
Platform:
PlatformID - int (primary key, auto-incr)
Name - nvarchar(50)
GamePlatform (not visible as an EF 4 entity):
GameID - int (foreign key from Games)
PlatformID - int (foreign key from Platforms)
我正在使用的视图模型:
public class PlatformListing
{
public Platform Platform { get; set; }
public bool IsSelected { get; set; }
}
public class AdminGameReviewViewModel
{
public Game GameData { get; set; }
public List<Genre> AllGenres { get; set; }
public List<PlatformListing> AllPlatforms { get; set; }
}
公共类平台列表
{
公共平台平台{get;set;}
公共布尔值被选为{get;set;}
}
公共类AdminGameReviewViewModel
{
公共游戏GameData{get;set;}
公共列表所有类型{get;set;}
公共列表所有平台{get;set;}
}
以及形式本身:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<HandiGamer.WebUI.ViewModels.AdminGameReviewViewModel>" %>
<p>
<%: Html.Label("Game Title") %>
<%: Html.TextBoxFor(model => Model.GameData.GameTitle) %>
<%: Html.ValidationMessageFor(model => Model.GameData.GameTitle) %>
</p>
<p>
<%: Html.LabelFor(model => Model.GameData.GenreID) %>
<%: Html.DropDownListFor(m => Model.GameData.GenreID, new SelectList(Model.AllGenres, "GenreID", "Name", Model.GameData.GenreID)) %>
</p>
<p>
<%: Html.Label("Platforms") %><br />
<% for(var i = 0; i < Model.AllPlatforms.Count; ++i)
{ %>
<%: Model.AllPlatforms[i].Platform.Name %> <%: Html.CheckBoxFor(p => Model.AllPlatforms[i].IsSelected) %>
<% } %>
</p>
<p>
<%: Html.Label("Review") %>
<%: Html.TextAreaFor(model => Model.GameData.ReviewText) %>
</p>
<p>
<%: Html.Label("Review Score") %>
<%: Html.DropDownListFor(m => Model.GameData.ReviewScore, new SelectList(new int[] {1, 2, 3, 4, 5}))%>
</p>
<p>
<%: Html.LabelFor(model => model.GameData.Pros) %><br />
<%: Html.TextAreaFor(model => model.GameData.Pros) %>
</p>
<p>
<%: Html.LabelFor(model => model.GameData.Cons) %><br />
<%: Html.TextAreaFor(model => model.GameData.Cons) %>
</p>
Model.GameData.GameTitle)%>
Model.GameData.GameTitle)%>
Model.GameData.GenreID)%>
Model.GameData.GenreID,新选择列表(Model.AllGenres,“GenreID”,“Name”,Model.GameData.GenreID))%>
Model.AllPlatforms[i].IsSelected)%>
Model.GameData.ReviewText)%>
Model.GameData.ReviewScore,新选择列表(新int[]{1,2,3,4,5}))%>
model.GameData.Pros)%>
model.GameData.Pros)%>
model.GameData.Cons)%>
model.GameData.Cons)%%>
最后,是我的Create方法(我正在努力实现这一点):
[HttpPost]
public ActionResult CreateReview([Bind(Prefix=“GameData”)]游戏新游戏,[Bind(Prefix=“AllPlatforms”)]列表平台列表)
{
尝试
{
foreach(平台列表中的var平台)
{
if(plat.IsSelected==true)
{
newGame.Platforms.Add(plat.Platform);
}
}
newGame.LastModified=DateTime.Now;
_siteDB.Games.AddObject(newGame);
_SaveChanges();
//将表单数据添加到实体,然后保存
返回操作(“索引”);
}
抓住
{
返回视图();
}
}
当然,问题在于我的复选框。布尔值isSelected设置得很好,但在发布数据时,相应的平台对象丢失。我以为它们会自动传回来。那么,关于如何传回平台列表的实际平台部分,有什么建议吗?关于获取复选框值,如何使用策略
关于将实体对象作为参数传递,我想说的是,您让数据层混合到视图层中,您应该使用专用的ViewModel。我不确定我是否理解您所说的“使用专用ViewModel”是什么意思。我认为视图模型应该是单向的——从模型派生,并通过控制器传递给视图。我不明白为什么我不应该期望在表单post上返回实际的模型数据。对我来说,将这些数据通过视图模型传回,而只需将其分解并存储在模型中是没有意义的。我遗漏了什么?@kevinmajor1:您还可以使用输入模型,对从视图传递到操作的数据进行建模。通过分离数据层、业务层和视图层,可以使代码更加模块化。例如,如何对控制器操作进行单元测试?您不能这样做(至少不容易),因为您正在操作中进行数据库访问。我可以给这个动作相同的输入,根据数据库中已有的数据得出完全不同的结果。是的,但现在我只想能够正确地创建一个游戏。我知道TDD是正确的选择,但我还是一个初学者。单元测试目前不是我关心的现实问题。在处理更复杂的主题之前,我需要处理的是能够从表单中获取数据并使用EF将其写入db。我希望能够以正确的方式完成这项工作,但首先我需要了解基本知识是如何实际工作的。@kevinmajor1:没关系。这些是每个开发人员必须在逐个项目的基础上做出的决策。祝你好运
[HttpPost]
public ActionResult CreateReview([Bind(Prefix = "GameData")]Game newGame, [Bind(Prefix = "AllPlatforms")]List<PlatformListing> PlatformList)
{
try
{
foreach(var plat in PlatformList)
{
if (plat.IsSelected == true)
{
newGame.Platforms.Add(plat.Platform);
}
}
newGame.LastModified = DateTime.Now;
_siteDB.Games.AddObject(newGame);
_siteDB.SaveChanges();
// add form data to entities, then save
return RedirectToAction("Index");
}
catch
{
return View();
}
}