2015-09-11 59 views
2

我想在我的MVC项目(单声道/ .NET 4.5)中使用数据注释。我创建了我的模型并添加了所有适当的注释。我有我的看法和控制器适当连线。然而,验证似乎并没有发生。我尝试了一切,我可以找到无济于事。由于这是我第一次使用Razor和Data Annotations,所以我想象一下我错过了一些安装程序,但是在我的生活中找不到它。这里是我的代码:在剃刀MVC数据注释

型号

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.ComponentModel; 
using System.ComponentModel.DataAnnotations; 
using System.Web.Mvc; 

namespace MyWebsite 
{ 
    public class RegisterViewModel : BaseViewModel 
    { 
    #region properties 
    [Required(ErrorMessage = "Required")] 
    [StringLength(50)] 
    [DisplayName("First Name")] 
    public string FirstName { get; set; } 
    [Required(ErrorMessage = "Required")] 
    [StringLength(100)] 
    [DisplayName("Last Name")] 
    public string LastName { get; set; } 
    [StringLength(50)] 
    [DisplayName("Display Name")] 
    public string DisplayName { get; set; } 
    [Required(ErrorMessage = "Required")] 
    [StringLength(255)] 
    [DisplayName("Email Address")] 
    public string EmailAddress { get; set; } 
    #endregion 

    #region ctor 
    public RegisterViewModel() 
    { 

    } 
    #endregion 

    } 
} 

控制器

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 

namespace MyWebsite.Controllers 
{ 
    public class AccountController : Controller 
    { 
    public ActionResult Register() 
    { 
     ViewData ["IsComplete"] = false; 
     ViewData ["RequiredVouches"] = WebSettings.RequiredVouches; 

     return View(); 
    } 

    [HttpPost] 
    public ActionResult Register(FormCollection formData) 
    { 
     if (ModelState.IsValid) { 
      //TODO: Put the data 
      ViewData ["IsComplete"] = true; 
     } 
     return View(); 
    } 
    } 
} 

查看

@model SummerIsles.Web.RegisterViewModel 
@section Styles { 
<link href="~/Content/themes/base/Account.css" rel="stylesheet" type="text/css" /> 
} 
@{ 
if((bool)@ViewData["IsComplete"]) { 
    <h1>Registration Request Complete!</h1> 
    <div class="page-message"> 
     <p> 
      Confirmation message goes here 
     </p> 
    </div> 
} 
else { 
    <h1>Registration</h1> 
    <div class="page-message"> 
     <p> 
      Instruction text goes here 
     </p> 
    </div> 
    using (Html.BeginForm()) { 
     @Html.ValidationSummary(false) 
     <fieldset> 
      <legend>Your Information</legend> 

      <div class="group column-1"> 
       @Html.LabelFor(modelItem => @Model.FirstName) 
       @Html.EditorFor(modelItem => @Model.FirstName, new { htmlAttributes = new { @class="form-control" } }) 
       @Html.ValidationMessageFor(modelItem => @Model.FirstName) 

       @Html.LabelFor(modelItem => @Model.DisplayName) 
       @Html.EditorFor(modelItem => @Model.DisplayName, new { htmlAttributes = new { @class="form-control" } }) 
       @Html.ValidationMessageFor(modelItem => @Model.DisplayName) 
      </div> 

      <div class="group column-2"> 
       @Html.LabelFor(modelItem => @Model.LastName) 
       @Html.EditorFor(modelItem => @Model.LastName, new { htmlAttributes = new { @class="form-control" } }) 
       @Html.ValidationMessageFor(modelItem => @Model.LastName) 

       @Html.LabelFor(modelItem => @Model.EmailAddress) 
       @Html.EditorFor(modelItem => @Model.EmailAddress, new { htmlAttributes = new { @class="form-control" } }) 
       @Html.ValidationMessageFor(modelItem => @Model.EmailAddress) 
      </div> 

      <div class="button-options"> 
       <button id="btnSubmit" type="submit" formmethod="post" class="btn btn-danger">Submit</button> 
       <a id="btnCancel" href="~/" class="btn">Cancel</a> 
      </div> 
     </fieldset> 
    } 
    } 
} 

另外,我公顷我已经将jquery验证脚本添加到了我的布局文件中,并且还启用了web.confg中的客户端验证。

布局页眉

<head> 
    <!--some other css and such--> 
    <script src="~/Scripts/jquery.validate.min.js"></script> 
    <script src="~/Scripts/jquery.validate.unobstrusive.min.js"></script> 
</head> 

的Web.config

<appSettings> 
    <!--some other stuff--> 
    <add key="ClientValidationEnabled" value="true" /> 
    <add key="UnobtrusiveJavaScriptEnabled" value="true" /> 
</appSettings> 

基本上,当我点击提交,它认为该模型是完全有效的(ModelState.IsValid控制器返回true )和验证的东西(我希望在发回控制器之前发射)似乎决不会触发。即使使用完全空白的表单(尽管有“必需的”数据注释),我也不会收到验证消息。我错过了什么?

+0

在服务器上,“ModelState”永远不会失效,因为您不使用模型。把你的POST方法改为'public ActionResult Register(RegisterViewModel model)'在客户端你还包含了'jquery- {version} .js'? –

+0

你是否在使用你的脚本包? –

回答

5
@Html.ValidationMessageFor(modelItem => @Model.LastName) 

应该

@Html.ValidationMessageFor(modelItem => modelItem.LastName) 

所有您HtmlHelpers,包括TextBoxFor和LabelFor等

而且

public ActionResult Register(FormCollection formData) 

应该

public ActionResult Register(RegisterViewModel model) 

为了您的服务器端ModelState.IsValid工作。

+0

完美的工作!非常感谢!此外,我不能相信我错过了modelItem => modelItem.LastName ....真的愚蠢的错误在我的一部分!再次感谢! –

+0

你是唯一犯这个错误的人;) –