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();
        }
    }