2015-05-19 31 views
0

假设以下领域模型。如何从MVC中的表单中检索两个模型?

public class SystemRequirement 
{ 
    public int SystemRequirementID { get; set; } 
    public Platforms Platform { get; set; } 
    public string CPU { get; set; } 
    public string RAM { get; set; } 
    public string Dsiplay { get; set; } 
    public string Discription { get; set; } 

    public int GameID { get; set; } 
    public virtual Game Game { get; set; } 
} 


public class Game 
{ 
    public int GameID { get; set; } 
    public string Name { get; set; } 
    public Genres Genre { get; set; } 
    public DateTime ReleaseDate { get; set; } 
    public bool Multiplay { get; set; } 
    public string About { get; set; } 

    public virtual List<SystemRequirement> SystemRequirements { get; set; } 
} 

public class GameSystemViewModel 
{ 
    public Game Game { get; set; } 
    public SystemRequirement SystemRequirement { get; set; } 
} 

我想制作一个表格,允许添加一个包含其系统要求的新游戏。

enter image description here

@model KeyStore.WebUI.Models.GameSystemViewModel 
 

 
@{ 
 
    ViewBag.Title = "Add"; 
 
    Layout = "~/Views/Shared/_AdminLayout.cshtml"; 
 
} 
 

 

 
<div class="container"> 
 
    @using (Html.BeginForm("Add", "GameAdmin", FormMethod.Post, new { enctype = "multipart/form-data" })) 
 
    { 
 
     <div class="panel"> 
 
      <div class="panel-heading"> 
 
       <h3>Add New Game</h3> 
 
      </div> 
 

 
      <div class="panel-body"> 
 

 
       @Html.LabelFor(m => m.Game.Name) 
 
       @Html.TextBoxFor(m => m.Game.Name) 
 

 
       @Html.LabelFor(m => m.Game.Genre) 
 
       @Html.TextBoxFor(m => m.Game.Genre) 
 

 
       @Html.LabelFor(m => m.Game.ReleaseDate) 
 
       @Html.TextBoxFor(m => m.Game.ReleaseDate) 
 

 
       @Html.LabelFor(m => m.Game.Multiplay) 
 
       @Html.CheckBoxFor(m => m.Game.Multiplay) 
 

 
       @Html.LabelFor(m => m.Game.About) 
 
       @Html.TextAreaFor(m => m.Game.About) 
 

 

 
      </div> 
 
     </div> 
 

 
     <div class="panel"> 
 
      <div class="panel-heading"> 
 
       <h3>System Requirements</h3> 
 
      </div> 
 

 
      <div class="panel-body"> 
 

 
       @Html.LabelFor(m => m.SystemRequirement.Platform) 
 
       @Html.TextBoxFor(m => m.SystemRequirement.Platform) 
 

 
       @Html.LabelFor(m => m.SystemRequirement.CPU) 
 
       @Html.TextBoxFor(m => m.SystemRequirement.CPU) 
 

 
       @Html.LabelFor(m => m.SystemRequirement.RAM) 
 
       @Html.TextBoxFor(m => m.SystemRequirement.RAM) 
 

 
       @Html.LabelFor(m => m.SystemRequirement.Dsiplay) 
 
       @Html.TextBoxFor(m => m.SystemRequirement.Dsiplay) 
 

 

 
       @Html.LabelFor(m => m.SystemRequirement.Discription) 
 
       @Html.TextAreaFor(m => m.SystemRequirement.Discription) 
 

 

 
      </div> 
 
     </div> 
 

 
     <div class="panel-footer"> 
 
      <input type="submit" value="Save" class="btn btn-primary" /> 
 
     </div> 
 

 
    } 
 
</div>

我的控制器类有这三个动作。

  1. 地址:做游戏视图
  2. [HttpPost]地址:获取对象和使用LINQ

控制器代码并将它们保存在一个数据库:

public ViewResult Add() 
 
{ 
 
    GameSystemViewModel g = new GameSystemViewModel(); 
 
    g.Game = new Game(); 
 
    g.SystemRequirement = new SystemRequirement(); 
 
    return View(g); 
 
} 
 

 

 
[HttpPost] 
 
public ActionResult Add(GameSystemViewModel g) 
 
{ 
 
    Game mygame = new Game(); 
 
    mygame = g.Game; 
 
    mygame.SystemRequirements.Add(g.SystemRequirement); 
 
    gameRepository.Save(mygame); 
 
    return RedirectToAction("Add"); 
 
}

但是当表单发布时出现以下错误发生。正如你在本地SystemRequirement中看到的那样NOT NULL。

enter image description here

这是什么问题,我该如何解决?

+2

您可能需要创建一个ViewModel,它将两种模型的组合,然后在您的View中使用它d控制器 –

+1

创建一个ViewModel –

+0

看看http://stackoverflow.com/questions/30196865/mvc-model-properties-and-multiple-forms-on-one-view/30197026#30197026 – Tushar

回答

3

您需要创建一个包含两个(SystemRequirement)复合视图模式,(游戏)类如下:

public class CombinedViewModel{ 

public SystemRequirement { get; set; } 
public Game { get; set; } 

} 

和控制器:

public ViewResult Add(){ 
    CombinedViewModel MyModel = new CombinedViewModel(); 
    MyModel.SystemRequirement = new SystemRequirement(); 
    MyModel.Game = new Game(); 
    return View(MyModel); 
} 


    [HttpPost] 
    public ActionResult Add(CombinedViewModel pModel){ 
     Game game = new Game(); 
     game = pModel.Game; 
     game.SystemRequirements = new List<SystemRequirement>(); 
     game.SystemRequirements.Add(pModel.SystemRequirement); 
     gameRepository.Save(game); 
     return RedirectToAction("Add"); 
    } 

视图将是:

@model CombinedViewModel 

@{ 
    ViewBag.Title = "Add"; 
    Layout = "~/Views/Shared/_AdminLayout.cshtml"; } 


<div class="container"> 
    @using (Html.BeginForm("Add", "GameAdmin", FormMethod.Post, new { enctype = "multipart/form-data" })) 
    { 
     <div class="panel"> 
      <div class="panel-heading"> 
       <h3>Add New Game</h3> 
      </div> 

      <div class="panel-body"> 

       @Html.LabelFor(m => m.Game.Name) 
       @Html.TextBoxFor(m => m.Game.Name) 

       @Html.LabelFor(m => m.Game.Genre) 
       @Html.TextBoxFor(m => m.Game.Genre) 

       @Html.LabelFor(m => m.Game.ReleaseDate) 
       @Html.TextBoxFor(m => m.Game.ReleaseDate) 

       @Html.LabelFor(m => m.Game.Multiplay) 
       @Html.CheckBoxFor(m => m.Game.Multiplay) 

       @Html.LabelFor(m => m.Game.About) 
       @Html.TextAreaFor(m => m.Game.About) 


      </div> 
     </div> 

     <div class="panel"> 
      <div class="panel-heading"> 
       <h3>System Requirements</h3> 
      </div> 

      <div class="panel-body"> 

       @Html.LabelFor(m => m.SystemRequirements.Platform) 
       @Html.TextBoxFor(m => m.SystemRequirements.Platform) 

       @Html.LabelFor(m => m.SystemRequirements.CPU) 
       @Html.TextBoxFor(m => m.SystemRequirements.CPU) 

       @Html.LabelFor(m => m.SystemRequirements.RAM) 
       @Html.TextBoxFor(m => m.SystemRequirements.RAM) 

       @Html.LabelFor(m => m.SystemRequirements.Dsiplay) 
       @Html.TextBoxFor(m => m.SystemRequirements.Dsiplay) 


       @Html.LabelFor(m => m.SystemRequirements.Discription) 
       @Html.TextAreaFor(m => m.SystemRequirements.Discription) 


      </div> 
     </div> 

     <div class="panel-footer"> 
      <input type="submit" value="Save" class="btn btn-primary" /> 
     </div> 

    } </div> 
+0

我完全按照您所提及的进行,我的视图非常干净。但我的问题是模型发布时如何使用LINQ保存游戏及其系统需求?为什么我得到NullReferenceExeption? –

+0

你的意思是你的控制器中的(Add)函数的POST动作中会出现nullRefrence异常?我编辑了控制器中的(添加)功能,所以你没有空异常 – Ala

+0

在game.SystemRequirements.Add(pModel.SystemRequirement) –

相关问题