Почему MetadataType не выполняет мою проверку в первом подходе к базе данных?

Я использовал Database-First для создания класса модели (файл EDMX) и хочу проверить его с помощью «MetadataType». Я читал решения здесь, но они не работали для меня.

Вот мой код:

[MetadataType(typeof(MovieEntitiesMetaData))]
public partial class MovieEntities
{        
}

public class MovieEntitiesMetaData
{
    [DisplayFormat(DataFormatString = "{0:c}")]
    public Nullable<global::System.Decimal> PRICE { get; set; }
}

Здесь чего-то не хватает или почему мое решение не сработало?


person Eddy Setiawan    schedule 06.10.2012    source источник


Ответы (1)


Создайте новый файл с именем MoviePartial.cs и поместите в него следующий код:

[MetadataType(typeof(MovieMetaData))]
public partial class Movie
{    
    internal sealed class MovieMetaData
    {
        [DisplayFormat(DataFormatString = "{0:F2}", ApplyFormatInEditMode = true)]
        [Required(ErrorMessage = "Price is required")]
        public decimal? PRICE { get; set; }
    }
}

Вам также необходимо передать тип Movie в представление, чтобы аннотации данных можно было подключить. Если у вас есть настраиваемая модель представления, аннотации данных не будут действовать.

В режиме создания/редактирования у вас должны быть:

@Html.EditorFor(m => m.PRICE)

В представлении «Подробности» у вас должны быть:

@Html.DisplayFor(m => m.PRICE)

Чтобы узнать больше об этом, просто следуйте этому хорошему пошаговому руководству:

Проверка с помощью средств проверки аннотаций данных (C#)

person Leniel Maccaferri    schedule 06.10.2012
comment
Я изменил код, но все равно не работает, как передать MovieEntities для просмотра? - person Eddy Setiawan; 06.10.2012
comment
Как называется объект, который будет потреблять ваше представление? Является ли MovieEntities именем вашего контекста данных или это имя таблицы, полученное из базы данных? - person Leniel Maccaferri; 06.10.2012
comment
MovieEntities — это имя Model/ConnectionString, которое сохраняет в web.config имя таблицы Movie. Но изменить класс на Movie все равно не получилось. Вот модель в начале моего представления @model IEnumerable‹MvcApplication3.Models.MOVIE› - person Eddy Setiawan; 06.10.2012
comment
Я отредактировал свой ответ, чтобы отразить название вашей организации - в данном случае Movie. Теперь в вашем действии контроллера с именем Create просто передайте новый объект Movie в представление и поместите @model MvcApplication3.Models.MOVIE вверху файла представления. Вы должны увидеть проверку в действии. Кстати: вы не указали никакой проверки для свойства Price. Я добавлю [Required] один. Смотрите мой ответ. Полное руководство смотрите по ссылке, которую я вам предоставил. - person Leniel Maccaferri; 06.10.2012
comment
Помимо проверки, я хочу добавить формат отображения для валюты, я думаю, что это работает так же. Но дисплей все тот же, что и раньше. Есть ли недостающий код, который я оставил? - person Eddy Setiawan; 06.10.2012
comment
Отредактировал мой ответ. Подробнее см. здесь: stackoverflow.com/q/5080451/114029 - person Leniel Maccaferri; 06.10.2012
comment
Я меняю метаданные на [Required(ErrorMessage = Price Required)], но проверка не работает. Я не знаю, как его использовать. Сначала я использовал базу данных для создания модели, поэтому я не могу редактировать файл .cs, созданный в Visual Studio. Не могли бы вы помочь решить эту проблему? - person Eddy Setiawan; 06.10.2012
comment
Вы должны создать файл с именем MoviePartial.cs и добавить код из моего ответа в этот файл. - person Leniel Maccaferri; 06.10.2012
comment
Я попытался создать MoviePartial.cs, но проверка и формат отображения по-прежнему не работали. Вид такой же, как вы упомянули в своем ответе. Есть ли какой-либо шаг, который мне нужно сделать? - person Eddy Setiawan; 06.10.2012
comment
Вы должны добавить ссылку на скрипты jquery, jquery-validate и jquery-unobtrusive в свой файл _Layout.cshtml. - person Leniel Maccaferri; 06.10.2012
comment
Что мне добавить jquery-unobtrusive-ajax.js или jquery.validate.unobtrusive.js? Я просто добавил jquery-unobtrusive-ajax.js, но это не сработало. Мой класс, содержащий таблицу, называется MovieEntities, а таблица представлена ​​с помощью класса Movie. Что-то не так с моей информацией, которая дает ее вам? - person Eddy Setiawan; 06.10.2012
comment
Вы должны добавить jquery.validate.unobtrusive.js. - person Leniel Maccaferri; 06.10.2012
comment
Все еще не работает. Я думаю, что ошибка в классе модели, я также делаю это по ссылке, которую вы мне дали. Это потому, что я не добавил Microsoft.Web.Mvc.DataAnnotations.dll? Я использовал ASP.net MVC 3. - person Eddy Setiawan; 06.10.2012
comment
Извините, проблема решена, потому что я назвал свой класс КИНО, а не фильм, поэтому ваш ответ уже сработал. Спасибо за вашу помощь - person Eddy Setiawan; 06.10.2012
comment
Вопрос, будет ли это работать, если я захочу наследовать от IValidatableObject? - person Vyache; 14.05.2014
comment
@Vyache да ... вы все еще можете выполнить проверку с помощью IValidatableObject. - person Leniel Maccaferri; 14.05.2014
comment
@LenielMacaferi, можешь привести пример? Я не могу этого сделать. У меня есть аннотации данных в частном закрытом классе. Частичный класс наследуется от BaseEntity, IValidatableObject, и, как вы знаете, это прежде всего база данных. Я не могу проверить свою пользовательскую проверку, но моя аннотация запечатанных данных работает нормально. - person Vyache; 15.05.2014
comment
@Вяче почему бы и нет? Проверьте это: stackoverflow.com/a/3401178/114029, если это не работает, задайте новый квест здесь, на StackOverflow. и покажите нам пример того, что вы делаете и почему это не работает. :) - person Leniel Maccaferri; 15.05.2014
comment
@LenielMacaferi на самом деле, я понял проблему. Проверка на стороне клиента должна пройти проверку перед IValidateObject. - person Vyache; 15.05.2014
comment
@Vyache: на самом деле проверка на стороне клиента не связана с проверкой на стороне сервера ... вам не нужен val на стороне клиента, чтобы выполнить val на стороне сервера. Вы упомянули IValidatableObject, который является значением на стороне сервера. В любом случае, приятно знать, что вы получили ожидаемый результат. - person Leniel Maccaferri; 15.05.2014
comment
@LenielMacaferi Извините, я имел в виду, что хотел сделать и то, и другое. Спасибо за помощь. - person Vyache; 15.05.2014