由于我是asp.net mvc 3的新手,我对它的内部过程并不了解。我有两个动作来创建新类别作为Get和Post方法:
public ActionResult Create()
{
List<Category> cat = this.display_children(null, 0);
List<SelectListItem> items = new SelectList(cat, "ID", "CategoryName").ToList();
items.Insert(0, (new SelectListItem { Text = "root", Value = "" }));
ViewBag.ParentCategoryID = items;
return View();
}
[HttpPost]
public ActionResult Create(Category category)
{
if (ModelState.IsValid)
{
db.Categories.AddObject(category);
db.SaveChanges();
return RedirectToAction("Index");
}
List<Category> cat = this.display_children(null, 0);
List<SelectListItem> items = new SelectList(cat, "ID", "CategoryName").ToList();
items.Insert(0, (new SelectListItem { Text = "root", Value = "" }));
ViewBag.ParentCategoryID = items;
return View(category);
}
以下是查看:
@model IVRControlPanel.Models.Category
@{
ViewBag.Title = "Create";
}
<h2>Create</h2>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>Category</legend>
<div class="editor-label">
@Html.LabelFor(model => model.CategoryName)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.CategoryName)
@Html.ValidationMessageFor(model => model.CategoryName)
</div>
<div class="editor-label">
@Html.Label("Select Category")
</div>
<div>
@*@Html.DropDownList("CategoryList",new SelectList(ViewBag.Categories))*@
@Html.DropDownList("ParentCategoryID", ViewBag.ParentCategoryID as SelectList)
@Html.ValidationMessageFor(model => model.ParentCategoryID)
</div>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
问题: 单击“创建”按钮而不填写“异常”之后的类别名称字段:
This property cannot be set to a null value.
仅当visual studio处于调试模式时才会抛出异常,当我继续调试时,只会在验证消息中显示错误。在这里,实际上必须显示的是,应该显示Error而不抛出异常,这在没有处于调试模式时是正常的。我在数据库中有以下类别表列,并使用模型第一种方法实体框架:
我不擅长asp.net mvc 3,无法想出可能出现的问题。
答案 0 :(得分:0)
在你的行动中替换:
ViewBag.ParentCategoryID = items;
使用:
ViewBag.Categories = items;
并在您看来:
@Html.DropDownListFor(x => x.ParentCategoryID, ViewBag.Categories as SelectList)
DropDownList帮助器需要2个参数:第一个表示将保存所选值的标量属性,第二个参数表示具有可用项的集合。他们应该是不同的。
答案 1 :(得分:0)
幸运的是我找到了解决方案。实际上,问题是由于PreBinding验证。我正在搜索并发现同样的问题link很好地解释了。
我已经为类别分类,如下所示:
public partial class Category{
}
public class TestEntityValidation{
[Required]
[DisplayFormat(ConvertEmptyStringToNull = false)]
public String CategoryName { get; set; }
}
这里,将空字符串转换为null设置为false,这解决了我在DisplayFormat属性上的问题。