Razor中的MVC数据注释

Sha*_*rry 2 c# asp.net-mvc mono razor asp.net-mvc-4

我正在尝试在我的MVC项目中使用Data Annotations(Mono/.NET 4.5).我创建了我的模型并添加了所有适当的注释.我的视图和控制器都有适当的连线.但是,验证似乎并没有发生.我已经尝试了一切我无法找到的东西.由于这是我第一次使用Razor和Data Annotations,我想有一些我不知道的设置部分,但我找不到它的生命.这是我的代码:

模型

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

  }
}
Run Code Online (Sandbox Code Playgroud)

调节器

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 ();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

视图

@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>
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

此外,我已将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>
Run Code Online (Sandbox Code Playgroud)

Web.config文件

<appSettings>
   <!--some other stuff-->
   <add key="ClientValidationEnabled" value="true" />
   <add key="UnobtrusiveJavaScriptEnabled" value="true" />
</appSettings>
Run Code Online (Sandbox Code Playgroud)

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

小智 5

@Html.ValidationMessageFor(modelItem => @Model.LastName)
Run Code Online (Sandbox Code Playgroud)

应该

@Html.ValidationMessageFor(modelItem => modelItem.LastName)
Run Code Online (Sandbox Code Playgroud)

适用于所有 HtmlHelpers,包括TextBoxFor和LabelFor等.

public ActionResult Register(FormCollection formData)
Run Code Online (Sandbox Code Playgroud)

应该

public ActionResult Register(RegisterViewModel model)
Run Code Online (Sandbox Code Playgroud)

为了让你的服​​务器端ModelState.IsValid工作.