做BS系统的都知道,表单验证涉及到前端验证和后端验证。因为我所使用的是Bootstrap框架,所以前端验证,我使用的bootstrapValidator这个验证框架,提一名这个框架有点老了。官网已不维护了,他们已经做了一个新的验证框架,更加的强大,但要收费了。
我下面简述一下ASP.NET MVC的表单后端验证。
1.在Model中,通过特性给每个属性增加一些需要验证的逻辑。如下代码中的
[Required(ErrorMessage ="工作日期不能为空")]
则是需要该属性提交到服务器时不为空值 。
public partial class ui_work_note
{
public int id { get; set; }
[Display(Name="工作日期")]
[DisplayFormat(DataFormatString ="{0:yyyy-MM-dd}",ApplyFormatInEditMode =true)]
[DataType(DataType.Date)]
[Required(ErrorMessage ="工作日期不能为空")]
public Nullable<System.DateTime> WorkDate { get; set; }
public Nullable<int> WorkStatus { get; set; }
[Display(Name = "工作时长")]
[Required(ErrorMessage = "工作时长不能为空")]
public Nullable<decimal> WorkTime { get; set; }
[Display(Name = "工作内容")]
[Required(ErrorMessage = "工作内容不能为空")]
public string WorkContent { get; set; }
[Display(Name = "工作详情")]
[Required(ErrorMessage = "工作详情不能为空")]
public string WorkNote { get; set; }
public string CreateId { get; set; }
public Nullable<System.DateTime> CreateDate { get; set; }
public string UpdateId { get; set; }
public Nullable<System.DateTime> UpdateDate { get; set; }
public string WorkRef1 { get; set; }
public string WorkRef2 { get; set; }
public string WorkRef3 { get; set; }
public string WorkRef4 { get; set; }
public string WorkRef5 { get; set; }
}
2.在Control中,需要使用验证方法进行验证。如下代码所述。
在方法中使用ModelState.IsValid进行验证。
[HttpPost]
public ActionResult update([Bind(Include = "id,WorkDate,WorkTime,WorkContent,WorkNote")] ui_work_note uiWorkNote)
{
if (ModelState.IsValid)
{
ui_work_note uiWorkNoteTemp = new ui_work_note();
using (HrEntities hr=new HrEntities())
{
uiWorkNoteTemp = (from workNote in hr.ui_work_note
where workNote.id == uiWorkNote.id
select workNote).FirstOrDefault<ui_work_note>();
uiWorkNoteTemp.WorkDate = uiWorkNote.WorkDate;
uiWorkNoteTemp.WorkTime = uiWorkNote.WorkTime;
uiWorkNoteTemp.WorkContent = uiWorkNote.WorkContent;
uiWorkNoteTemp.WorkNote = uiWorkNote.WorkNote;
hr.SaveChanges();
return RedirectToAction("index");
}
}
return View(uiWorkNote);
}
3.View中,需要使用在第一步的模型文件。在View文件中,首行,加上如下代码
@model ui_work_note
其中 ui_work_note是第一步中的类名。
在表单处使用Razor的语法,如下:
<div class="form-group">
<div class="row">
<div class="col-md-2">
@Html.LabelFor(m => m.WorkDate, new { @class = "control-label" })
</div>
<div class="col-md-5">
<div class="input-group date">
@Html.TextBoxFor(m => m.WorkDate, "{0:yyyy-MM-dd}", new { @class = "form-control", id = "WorkDate", name = "WorkDate", placeholder = "工作日期" })
<span class="input-group-addon"><i class="glyphicon glyphicon-th"></i></span>
</div>
</div>
</div>
</div>
@Html.ValidationMessageFor(m => m.WorkDate)
注意上面这条语句,这条语句,会将在第一步中设置的不满足条件时的提示信息带到前端页面上。但其实,我验证过了,不要这条语句,亦不影响后端验证,只不过没有前端提示了。
因为,我使用了前面所述的前端验证框架,所以可以不加上面这条语句。而直接使用自己心仪的前端验证框架。这样前端和后端分得更开了。我以为。