Asp.net mvc EF数据库第一次生成的表单赢得';无法验证
我刚刚创建了一个新的控制器,以及它的CRUD表单,等等,带有一个数据库first EF模型/实体 它在保存时抛出了许多验证错误,但是由于表单有验证程序,我不明白为什么会这样 出于我无法理解的原因,我根本没有得到任何验证。它直接进入saveChanges()调用,该调用立即失败 以下是编辑表单:Asp.net mvc EF数据库第一次生成的表单赢得';无法验证,asp.net-mvc,entity-framework,Asp.net Mvc,Entity Framework,我刚刚创建了一个新的控制器,以及它的CRUD表单,等等,带有一个数据库first EF模型/实体 它在保存时抛出了许多验证错误,但是由于表单有验证程序,我不明白为什么会这样 出于我无法理解的原因,我根本没有得到任何验证。它直接进入saveChanges()调用,该调用立即失败 以下是编辑表单: @model StatementsApplication.DAL.StatementTask @{ ViewBag.Title = "Edit"; } <h2>Edit&l
@model StatementsApplication.DAL.StatementTask
@{
ViewBag.Title = "Edit";
}
<h2>Edit</h2>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")"></script>
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>StatementTask</legend>
<div class="editor-label">
@Html.LabelFor(model => model.sInitials)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.sInitials)
@Html.ValidationMessageFor(model => model.sInitials)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.dtCompleted)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.dtCompleted)
@Html.ValidationMessageFor(model => model.dtCompleted)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.sGroupLabel)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.sGroupLabel)
@Html.ValidationMessageFor(model => model.sGroupLabel)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.nGroupSequence)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.nGroupSequence)
@Html.ValidationMessageFor(model => model.nGroupSequence)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.sTaskType)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.sTaskType)
@Html.ValidationMessageFor(model => model.sTaskType)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.sTaskLabel)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.sTaskLabel)
@Html.ValidationMessageFor(model => model.sTaskLabel)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.nTaskSequence)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.nTaskSequence)
@Html.ValidationMessageFor(model => model.nTaskSequence)
</div>
@Html.HiddenFor(model => model.ID)
<p>
<input type="submit" value="Save" />
</p>
</fieldset>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
对于为什么sInitials抛出“必需”验证错误,以及为什么sGroupLabel抛出长度验证错误,我感到有些困惑
谢谢a)您的模型没有数据验证注释。因此,MVC不做任何验证,因为您没有告诉它要验证什么
b) 你没有提到你要提交什么。你只是在提交一张空表格吗 数据注释似乎可以解决这个问题
[Required(AllowEmptyStrings = true)]
[DisplayFormat(ConvertEmptyStringToNull = false)]
public object Note { get; set; }
通过我同意,它没有任何验证,因此我从提交中得到验证错误的原因是一个谜。然而,为了回答您的(b)问题,我正在编辑一行,其中填充了一些数据……一个预先存在的行,包含由另一个进程生成的数据。@reidLinden-有2(或3)个验证级别。有客户端jquery验证,有服务器端MVC验证,然后EF对其模型属性进行验证。您是否在ef模型中使用fluent映射?你是说有些字段是必需的吗?我对asp.net/mvc之类的东西很生疏……所以我甚至不能说我对诸如流利之类的术语缺乏认识就意味着我不是……我可能是。我只知道我已经从现有数据库生成了EF层。我发现了最大长度的错误。我更新了表,但忘了重新运行模型刷新…但它仍然在抱怨sInitials..我唯一的想法是,不知何故,由于列具有NOTNULL约束(默认值为“”),当空字段返回到服务器时,或者你提到的EF验证层。空的被计算为空。我的猜测似乎是正确的。sInitials作为“”(一个空字符串)进入编辑视图,但返回后将另存为空值。是否有更好的方法来处理此问题,而不仅仅是检测案例并重置为“”?这看起来很脆弱,所以我预计会有一个聪明的诀窍让它工作。@reidLinden-聪明的诀窍是,如果要传递空值,就应该使数据库中的值为空。使用空字符串只是自找麻烦。
//
// GET: /StatementTask/Edit/5
public ActionResult Edit(int id = 0)
{
StatementTask statementtask = db.StatementTasks.Find(id);
if (statementtask == null)
{
return HttpNotFound();
}
ViewBag.StmtBatchID = new SelectList(db.StatementBatches, "ID", "sStatus", statementtask.StmtBatchID);
return View(statementtask);
}
//
// POST: /StatementTask/Edit/5
[HttpPost]
public ActionResult Edit(StatementTask statementtask)
{
if (ModelState.IsValid)
{
try
{
db.Entry(statementtask).State = EntityState.Modified;
db.SaveChanges();
}
catch (Exception ex) {
throw ex;
}
return RedirectToAction("Index");
}
ViewBag.StmtBatchID = new SelectList(db.StatementBatches, "ID", "sStatus", statementtask.StmtBatchID);
return View(statementtask);
}
[Required(AllowEmptyStrings = true)]
[DisplayFormat(ConvertEmptyStringToNull = false)]
public object Note { get; set; }