今天在做项目练习的时候发现,MVC中使用自带的模型验证时会提前显示在界面上,比如下面所示:
这是什么原因了,是因为我在表示get请求的action里面返回了其界面所显示使用的model,我们知道mvc的请求路径是分为3步的。
1:浏览器发送请求,经过底层路由的解析到达控制器,从而到达Action中。
2:在Action中我们进行常规的处理,(调用业务逻辑,操作数据库等),返回到指定的页面HTML中。
3:浏览器渲染页面,显示一些我们需要知道的内容出来。
这是简单的一些流程,那么我们为什么会出现那个错误提示,那个本应该是在表单提交之后,要是有错误或者不符合要求才需要显示的,这个错误就是我们配置和action中返回值的问题。
之前出现上图的问题我的M和C中代码是这样的。
M:
public class CreateResponseTextMessageView { [Display(Name="响应文本内容"),Required(ErrorMessage ="内容不能为空")] public string Context { get; set; } public DateTime CreateTime { get; set; } }
C:
[HttpGet] public ActionResult Create(CreateResponseTextMessageView model) { return View(model); }
V:
<div class="form-group"> @Html.LabelFor(x => x.Context, new { @class = "col-sm-2 control-label" }) <div class="col-sm-5"> @Html.TextAreaFor(x => x.Context, new { @class = "form-control", placeholder = "文本内容" }) </div> <div class="col-sm-4"> <div class="help-block">@Html.ValidationMessageFor(x => x.Context)</div> </div> </div>
这里可以看到我们在action中返回了model,其实这是多余的,我们在post的时候准备的验证,现在就提前起作用了,只有让action不返回任何东西,这样我们的验证才不会启动,这样就没有了刚打开页面就出现了错误信息,这是非常不友好的用户体验。
[HttpGet] public ActionResult Create() { return View(); }
这样不让其有返回值,不触动验证,那么就不会提前出现验证提示消息。
我们这个验证的用处是在表单提交(POST)之后,在处理页面进行验证的时候才使用,当我们没有通过验证时,就会返回空的model到前台页面,这样就会触动验证提示。