Entity Framework - Проверка (сервер + клиентская сторона, jquery) с аннотациями данных, БЕЗ MVC? - PullRequest
0 голосов
/ 13 сентября 2010

Есть несколько учебных пособий, которые объясняют, как использовать аннотацию данных EF для проверки форм с использованием инфраструктуры MVC.И использовать jquery для клиентской стороны.

См. Например: http://dotnetaddict.dotnetdevelopersjournal.com/clientvalidation_mvc2.htm

Я хотел бы добиться того же, но без использования MVC / MVC2.

Я хочучтобы создать классический сайт asp.net, создать модель сущностей, создать мои частичные классы, которые включают проверку (обязательно, регулярное выражение и т. д.).

Я создал модель сущностей и частичные классы, включая аннотации данных.Я могу добавить новые записи в БД.

Мне не хватает проверки.Теперь я могу добавлять записи в БД, даже если поля недействительны, я хотел бы получить ошибки, и, если возможно, я хотел бы использовать jquery для проверки клиента (в MVC вы просто добавляете <% Html.EnableClientValidation(); %> в представление...).

Вы можете мне помочь?Или укажите мне несколько хороших онлайн-ресурсов, которые объясняют это?

Большое спасибо.

РЕДАКТИРОВАТЬ : Я нашел здесь кое-что:

Как я могу сказать валидатору аннотаций данных также проверять сложные дочерние свойства?

У меня есть объект под названием «Пользователь», и я создал частичный класс следующим образом:

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:

Это всегда было "true", потому что я заполнял свойства "user" следующим образом:

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

Я изменил объект: от «User» до «UserMetaData» (User userToAdd = new UserMetaData();), тогда проверка работает («false» в случае, если регулярное выражение не соблюдается) ... но все же, довольно странно ... тогда я должен создать еще один объект "User"и заполнить его снова ... не очень чисто ...

1 Ответ

0 голосов
/ 30 июня 2011

Вы, вероятно, уже нашли решение или уже приступили к работе, но я создал проект с открытым исходным кодом, который делает именно это - проверка стиля MVC с атрибутами аннотаций данных и проверка jQuery.*

Вас заинтересует ветка 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...