我有以下两个类:
public class Game
{
public int ID { get; set; }
public string Title { get; set; }
public DateTime ReleaseDate { get; set; }
public string Genre { get; set; }
public Console Console { get; set; }
}
public class Console
{
public int ID { get; set; }
public string Title { get; set; }
public DateTime ReleaseDate { get; set; }
public string Company { get; set; }
}
在此之后,我添加了一个带脚手架的GameController。现在我正在研究游戏对象的创建视图,我遇到的问题是MVC HTML.helpers正在为Console对象的所有属性而不是仅仅标题呈现输入字段(我猜这是合乎逻辑的,鉴于该属性是一个实际的Console对象。
我仍然希望用户为正在创建的游戏对象选择一个控制台,所以我尝试通过以下方式解决它:
<div class="form-group">
@Html.LabelFor(model => model.Genre, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Genre, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Genre, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Console, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Console.Title, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Console.Title, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Create" class="btn btn-default" />
</div>
</div>
</div>
我想我只想提一下模型的title属性,但我仍然在Game的创建视图中接收所有Console属性的输入字段。 我知道这只是MVC的工作方式。但是我应该如何处理这样的事情呢?我也尝试过这样的事情:
Console: @Html.DropDownList("console", "All")
当然,这里的问题是HTML表单不理解该字段是作为正在创建的游戏对象的控制台字段而被采用的。这个问题的正确解决方案是什么?
编辑: 我做了以下事情: 添加gameCreation viewModel:
public class GameCreation
{
public Game game { get; set; }
public SelectList Consoles { get; set; }
}
然后我构建了我的ViewModel并将其传递给控制器查看:
public ActionResult Create()
{
var gc = new GameCreation();
gc.Consoles = cb.BuildList(db);
return View(gc);
}
请注意,cb.BuildList(db)返回SelectList项。然后在视图中我尝试了:
<div class="form-group">
@Html.LabelFor(model => model.Console.Title, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.DropDownList("console", gc.Consoles)
@Html.ValidationMessageFor(model => model.Console.Title, "", new { @class = "text-danger" })
</div>
</div>
这不起作用,因为gc未知。我也试过通过ViewBag传递数据,但这个项目在这里也不知道。然后我收到了错误: HTMLHelper没有名为'dropdownlist'的适用方法。如何访问我传递的viewmodel的数据?