【问题标题】:Entity Framework - Validation (server + clientside, jquery) with data annotations, WITHOUT MVC?实体框架 - 验证(服务器 + 客户端,jquery)与数据注释,没有 MVC?
【发布时间】:2010-09-13 09:09:13
【问题描述】:

有几个教程解释了如何使用 EF 数据注释来使用 MVC 框架进行表单验证。并在客户端使用 jquery。

参见例如: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”总是“true”,即使我将字段保留为空。帮助:-S

EDIT2:

它总是“真”,因为我正在填写“用户”属性,如下所示:

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

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

【问题讨论】:

    标签: asp.net entity-framework validation jquery-validate data-annotations


    【解决方案1】:

    您现在可能已经找到了解决方案或继续前进,但我创建了一个开源项目,正是这样做的 - 使用 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);
    }
    

    【讨论】:

      猜你喜欢
      • 2011-07-20
      • 2011-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多