0

有几个教程解释了如何使用EF数据注释来使用MVC框架进行表单验证。并为客户端使用jQuery。实体框架 - 验证(服务器+ clientside,jquery)与数据注释,WITHOUT MVC?

参见例如:http://dotnetaddict.dotnetdevelopersjournal.com/clientvalidation_mvc2.htm

我想达到相同的,但不使用MVC/MVC2。我想建立一个经典的asp.net网站,创建实体模型,创建包括验证(必需,正则表达式等)我的部分类。

我创建了实体模型和包含数据注释的部分类。我可以将新记录添加到数据库。

我想念的是验证。现在我可以添加记录到数据库,即使这些字段无效,我想获得错误,并且如果可能的话我想使用jquery进行客户端验证(在MVC中,您只需将<% Html.EnableClientValidation(); %>添加到视图中... )。

你能帮我吗?或者指出一些很好的在线资源来解释这一点?

非常感谢。

编辑:我发现这里的东西:

How can I tell the Data Annotations validator to also validate complex child properties?

我有一个实体,称为 “用户” 和我创建了一个局部类,如下所示:

using System.ComponentModel; 
using System.ComponentModel.DataAnnotations; 

namespace MySite.Models 
{ 
    [MetadataType(typeof(UserMetaData))] 
    public partial class User 
    { 
    } 

    public class UserMetaData 
    { 
     [Required(ErrorMessage = "Username Required")] 
     [DisplayName("Username")] 
     public string Username{ get; set; } 

     [DisplayName("Password")] 
     [Required(ErrorMessage = "Password Required")] 
     [RegularExpression(@"^[^;>;&;<;%?*!~'`;:,."";+=|]{6,10}$", ErrorMessage = "The password must be between 6-10 characters and contain 2 digits")] 
     public string Password{ get; set; } 
    } 
} 

在后面的代码我已经在上面提到的链接中加入了类似的“isValid”检查:

var validationContext = new ValidationContext(person, null, null); 
var validationResults = new List<ValidationResult>(); 

var isValid = Validator.TryValidateObject(userToAdd, validationContext, validationResults); 

if (isValid) 
{ 
savetoDB(); 
} 

但是,当我调试...“isValid”总是“真”,即使我离开字段为空。说明:-S

EDIT2:

这一直是 “真”,因为我被灌了 “用户” 属性,如下所示:

User userToAdd = new User(); 
userToAdd.Username = txtUsername.Text; 
userToAdd.Password = txtPassword.Text; 

我改变了对象:从 “用户” “UserMetaData”(User userToAdd = new UserMetaData();),然后验证工作(假如不尊重正则表达式,则为“假”)......但仍然很奇怪......然后我应该创建另一个“用户”对象并重新填充它...不是很干净...

回答

0

你可能已经找到了一个解决方案或现在移动,但我cr吃了一个开源项目,完成了这个 - 使用Data Annotations属性和jQuery Validate的MVC风格验证。

http://xvalwebforms.codeplex.com

你会感兴趣的jQuery.Validate分支。它还不完整,但非常接近。下面是从演示项目的例子:

型号

public class Booking : IValidatableObject 
{ 
    [Required(ErrorMessage = "Client name is required.")] 
    [StringLength(15, ErrorMessage = "Client name must be less than 15 characters.")] 
    public string ClientName { get; set; } 

    [Range(1, 20, ErrorMessage = "Number of guests must be between 1 and 20.")] 
    public int NumberOfGuests { get; set; } 

    [Required(ErrorMessage = "Arrival date is required.")] 
    [DataType(DataType.Date, ErrorMessage = "Arrival date is invalid.")] 
    public DateTime ArrivalDate { get; set; } 

    [Required(ErrorMessage = "Smoking type is requried.")] 
    public SmokingType SmokingType { get; set; } 

    [Required(ErrorMessage = "Email address is required.")] 
    [DataType(DataType.EmailAddress, ErrorMessage = "Email address is invalid.")] 
    public string EmailAddress { get; set; } 

    #region IValidatableObject Members 

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     if (ArrivalDate == DateTime.MinValue) 
     { 
      yield return new ValidationResult("Arrival date is required.", new[] {"ArrivalDate"}); 
     } 

     // Business rule: Can't place bookings on Sundays 
     if (ArrivalDate.DayOfWeek == DayOfWeek.Sunday) 
     { 
      yield return new ValidationResult("Bookings are not permitted on Sundays.", new[] {"ArrivalDate"}); 
     } 
    } 

    #endregion 
} 

ASPX标记

<fieldset class="booking"> 
     <legend>Booking</legend> 
     <asp:ValidationSummary ID="valSummary" runat="server" CssClass="ui-state-error" /> 
     <val:ModelValidator ID="valBooking" runat="server" CssClass="validator" Display="Dynamic" 
      ModelType="xVal.WebForms.Demo.Booking" /> 
     <label for="txtClientName"> 
      Your name:</label> 
     <asp:TextBox ID="txtClientName" runat="server" /> 
     <val:ModelPropertyValidator ID="valClientName" runat="server" CssClass="validator" 
      ControlToValidate="txtClientName" Display="Dynamic" PropertyName="ClientName" 
      ModelType="xVal.WebForms.Demo.Booking" /> 
     <label for="txtNumberOfGuests"> 
      Number of guests:</label> 
     <asp:TextBox ID="txtNumberOfGuests" runat="server" /> 
     <val:ModelPropertyValidator ID="valNumberOfGuests" runat="server" CssClass="validator" 
      ControlToValidate="txtNumberOfGuests" Display="Dynamic" PropertyName="NumberOfGuests" 
      ModelType="xVal.WebForms.Demo.Booking" /> 
     <label for="txtArrivalDate"> 
      Arrival date:</label> 
     <asp:TextBox ID="txtArrivalDate" runat="server" CssClass="date-picker" /> 
     <val:ModelPropertyValidator ID="valArrivalDate" runat="server" CssClass="validator" 
      ControlToValidate="txtArrivalDate" Display="Dynamic" PropertyName="ArrivalDate" 
      ModelType="xVal.WebForms.Demo.Booking" /> 
     <label for="txtEmailAddress"> 
      Email address:</label> 
     <asp:TextBox ID="txtEmailAddress" runat="server" /> 
     <val:ModelPropertyValidator ID="valEmailAddress" runat="server" CssClass="validator" 
      ControlToValidate="txtEmailAddress" Display="Dynamic" PropertyName="EmailAddress" 
      ModelType="xVal.WebForms.Demo.Booking" /> 
     <div> 
      <asp:Button ID="btnSubmit" runat="server" Text="Submit" OnClick="btnSubmit_Click" /></div> 
    </fieldset> 

背后

protected void btnSubmit_Click(object sender, EventArgs e) 
{ 
    if (!IsValid) 
    { 
     return; 
    } 

    if (txtNumberOfGuests.Text.Length == 0) 
    { 
     txtNumberOfGuests.Text = "1"; 
    } 

    Booking booking = new Booking 
          { 
           ClientName = txtClientName.Text, 
           NumberOfGuests = Convert.ToInt32(txtNumberOfGuests.Text), 
           ArrivalDate = Convert.ToDateTime(txtArrivalDate.Text), 
           EmailAddress = txtEmailAddress.Text 
          }; 

    BookingManager.PlaceBooking(booking); 
} 
代码