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); 
} 
代碼