ASP.NET MVC3: почему мои пользовательские атрибуты проверки никогда не работают? - PullRequest
0 голосов
/ 09 декабря 2011

В принципе, я правильно следовал различным учебникам. Теперь мои модели взяты из библиотечного файла (dll), что не должно быть проблемой, так как все остальное работает нормально.

Моя модель:

public class RoomBookingInsert
{

    public Int32 CostCentreNo { get; set; }
    public Int32 CustomerAccNo { get; set; }
    public Int32 RoomNo { get; set; }
    public Int32 ServiceCode { get; set; }
    [PriceValidation]
    public Decimal HourlyRate { get; set; }
    [DataType(DataType.Date)]
    [DateRange("2010/12/01", "2010/12/16")]
    public DateTime StartDate { get; set; }
}

Атрибуты распознаются, так как они соответственно окрашиваются в синий цвет, и автозаполнение обнаруживает их. Однако, когда я публикую свою форму, она принимает все.

Я включил свой код ниже для атрибутов проверки, и я понял, что это на стороне сервера, и так происходит с командой post.

Моя форма в asp.net mvc3 с помощью бритвы:

@model MyLibrary.RoomBookingInsert

@{
    ViewBag.Title = "Temp";
}

<h2>Temp</h2>

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>RoomBookingInsert</legend>

        @Html.EditorForModel()
        <p>
            <input type="submit" value="Save" />
        </p>
    </fieldset>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

Вот моя первая проверка цены (гарантирующая, что она никогда не станет отрицательной).

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;

    public class PriceValidationAttribute : ValidationAttribute

    {
        private decimal minPrice = 0.00M;
        private decimal maxPrice = 100.00M;

            public PriceValidationAttribute()
            {
            }
            public override bool IsValid(object value)
            {
                decimal price = (decimal)value;
                if (price < this.minPrice || price > this.maxPrice)
                    return false;
                return true;
            }

    }

Вот моя проверка диапазона дат:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel.DataAnnotations;
using System.Globalization;

    public class DateRangeAttribute : ValidationAttribute
    {
        private const string DateFormat = "yyyy/MM/dd";
        private const string DefaultErrorMessage =
               "'{0}' must be a date between {1:d} and {2:d}.";

        public DateTime MinDate { get; set; }
        public DateTime MaxDate { get; set; }

        public DateRangeAttribute(string minDate, string maxDate)
            : base(DefaultErrorMessage)
        {
            MinDate = ParseDate(minDate);
            MaxDate = ParseDate(maxDate);
        }

        public override bool IsValid(object value)
        {
            if (value == null || !(value is DateTime))
            {
                return true;
            }
            DateTime dateValue = (DateTime)value;
            return MinDate <= dateValue && dateValue <= MaxDate;
        }
        public override string FormatErrorMessage(string name)
        {
            return String.Format(CultureInfo.CurrentCulture,
                ErrorMessageString,
                name, MinDate, MaxDate);
        }

        private static DateTime ParseDate(string dateValue)
        {
            return DateTime.ParseExact(dateValue, DateFormat,
                 CultureInfo.InvariantCulture);
        }

}

Ответы [ 3 ]

1 голос
/ 09 декабря 2011

Для проверки клиента я не вижу, вы включили ссылку на сам jQuery. Можете ли вы проверить еще раз?

Для проверки сервера вы должны Validate указать это явно (как описано в user1039947 .

Я бы предложил вам использовать 'Mvc.Futures', в котором реализованы некоторые валидаторы

1 голос
/ 09 декабря 2011

Страница не будет автоматически подтверждена.Чтобы проверить страницу, что вам нужно сделать на вашем контроллере, это примерно так:

// Guessing your view is called Temp...
public class TempController : Controller
{
    // This method will create the view with the RoomBookingInsert model
    // NOTE: it has no HttpPost attribute
    public ActionResult Temp()
    {
         return View(new MyLibrary.RoomBookingInsert());
    }

    // This is the post back action method for your view
    // NOTE: this has an HttpPost attribute
    [HttpPost]
    public ActionResult Temp(MyLibrary.RoomBookingInsert model)
    {
        // Always start by checking the model state and if it is not valid
        // return the view with the original model
        if(!ModelState.IsValid)
        {
            return View(model);
        }

        // Rest of logic goes here
        ...
    }

}
0 голосов
/ 09 декабря 2011

Одна большая проблема, которую я заметил в вашем валидаторе даты и времени, заключается в том, что вы возвращаете true, когда значение равно нулю или это не дата и время. Должен вернуть false.

Еще одна проблема в десятичном валидаторе: вы не проверяете значение на null и не проверяете, является ли он действительным десятичным числом. Вы просто указываете это, и если значение не является десятичным, оно выдаст исключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...