我创建/生成了这个非常简单的MVC程序(1分钟),步骤是 1.创建MVC5 asp程序并创建新模型类 - 测试模型 2.到控制器添加 - > scaffold并提供模型和上下文类。
生成了crud操作,一切正常 我现在想要的是,用户点击性别中的创建他将有下拉列表,他可以选择,我写这个代码,我从上一篇文章,我得到转储html下拉,我是什么在这里失踪?
模型
using System.Collections.Generic;
using System.Data.Entity;
using System.Web.Mvc;
namespace TestropDownCreate.Models
{
public class TestModel
{
public int ID { get; set; }
public string Name { get; set; }
public string SelectedGender { get; set; }
public IEnumerable<SelectListItem> Gender
{
get
{
return new[]
{
new SelectListItem {Value = "M", Text = "Male"},
new SelectListItem {Value = "F", Text = "Female"}
};
}
}
}
public class TestModelDBContext : DbContext
{
public DbSet<TestModel> TestModel { get; set; }
}
}
通过scaffold生成的视图,你可以看到我评论生成的代码并放入 @ Html.DropDownListFor导致转储,我应该如何解决它。
@model TestropDownCreate.Models.TestModel
@{
ViewBag.Title = "Create";
}
<h2>Create</h2>
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
<h4>TestModel</h4>
<hr />
@Html.ValidationSummary(true)
<div class="form-group">
@Html.LabelFor(model => model.Name, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Name)
@Html.ValidationMessageFor(model => model.Name)
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.SelectedGender, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.DropDownListFor(model => model.SelectedGender, Model.Gender)
@*@Html.EditorFor(model => model.SelectedGender)
@Html.ValidationMessageFor(model => model.SelectedGender)*@
</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>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
答案 0 :(得分:0)
我会根据您获得ArgumentNullException
例外的经验提出一个大胆的建议,因为SelectedGender
的值尚未设置。所以,正在发生的事情就是......
@Html.DropDownListFor(model => model.SelectedGender, Model.Gender)
asp.net尝试预先选择具有某些值的下拉列表,为此,它会查看SelectedGender
的值并尝试将其与Gender
中提供的任何值进行匹配但是,SelectedGender
没有设置任何内容,因为它为空。现在,要解决此问题,您可以采用以下两种方法:
使用与SelectedGender
中指定的值之一匹配的默认值初始化Gender
... M或F
使用虚拟默认值(例如空字符串)初始化SelectedGender
,然后将默认值添加到Gender
,如下所示...
public IEnumerable<SelectListItem> Gender
{
get
{
return new[]
{
new SelectListItem {Value = "", Text = "--Select a gender--"},
new SelectListItem {Value = "M", Text = "Male"},
new SelectListItem {Value = "F", Text = "Female"}
};
}
}
Jhoon在评论中指出你没有真正需要在数据库中保留性别价值的建议,但我知道这不属于你的问题范围