Как использовать Html.GetUnobtrusiveValidationAttributes () - PullRequest
8 голосов
/ 23 ноября 2011

Я пытаюсь обойти тот факт, что, когда они написали asp.net MVC 3, они забыли включить код для добавления ненавязчивых атрибутов проверки для выбора списков, и их «исправление» для этого должно включать это в MVC 4, который никому не нужен для использования MVC 3.

Мой предложенный обходной путь - использовать Html.GetUnobtrusiveValidationAttributes(), чтобы добавить их самостоятельно, как и любые другие пользовательские атрибуты, но я не могу определить правильный синтаксис для вызова метода. Есть 2 перегрузки, одна принимает строку, а другая - строку и класс ModelMetaData. Я понимаю параметр метаданных, я предполагаю, что просто передаю ViewData.ModelMetadata, но какой должна быть строка? Документация MSDN говорит, что это «указанный атрибут имени HTML», который не имеет смысла для меня. Атрибут имени HTML чего? Список выбора? Зачем ему это нужно и как это поможет ему узнать, для какого свойства моей модели я хочу проверить? Глядя на примеры использования, они все, кажется, передают имя свойства в моей модели, для которого мне нужны атрибуты проверки, что имеет смысл. К сожалению, я не могу заставить метод возвращать что-либо, кроме пустой коллекции, независимо от того, что я передаю.

Мой класс модели называется Event, а мое свойство называется EventTypeID. Я использую немного другой класс viewmodel в качестве основы для представления, потому что мне нужно отобразить список событий, а также разрешить ввод нового события в том же представлении, поэтому у меня есть простой класс viewmodel, как показано ниже:

public class EventViewModel
{
    public Model.Event NewEvent { get; set; }
    public IEnumerable<Model.Event> Events { get; set; }
}

Раскрывающийся список сопоставляется со свойством, например: @Html.DropDownListFor(model => model.NewEvent.EventTypeID что я передаю в виде строки Html.GetUnobtrusiveValidationAttributes(string) или Html.GetUnobtrusiveValidationAttributes(string, ModelMetadata), чтобы получить атрибуты для этого свойства. Я пробовал:

Html.GetUnobtrusiveValidationAttributes("EventTypeID")
Html.GetUnobtrusiveValidationAttributes("EventTypeID",ViewData.ModelMetadata)
Html.GetUnobtrusiveValidationAttributes("NewEvent.EventTypeID")
Html.GetUnobtrusiveValidationAttributes("NewEvent.EventTypeID",ModelMetadata)

Все они возвращают пустую коллекцию.

Я знаю, что моя модель верна, потому что, если я изменю вызов с Html.DropDownListFor на Html.TextBoxFor, тогда проверка «просто работает», и мне не нужно делать ничего, кроме добавления атрибутов проверки в мой класс модели.

РЕДАКТИРОВАТЬ:

Только что попытался отключить проверку на стороне клиента, проверка отлично работает на стороне сервера для всех списков выбора.

Ответы [ 3 ]

15 голосов
/ 23 февраля 2013

Для тех, кто все еще ищет ответ, это работает для меня:

public static IDictionary<string, object> UnobtrusiveValidationAttributesFor<TModel, TProperty>(this HtmlHelper<TModel> html, Expression<Func<TModel, TProperty>> propertyExpression)
{
    var propertyName = html.NameFor(propertyExpression).ToString();
    var metadata = ModelMetadata.FromLambdaExpression(propertyExpression, html.ViewData);
    var attributes = html.GetUnobtrusiveValidationAttributes(propertyName, metadata);
    return attributes;
}

Обратите внимание, что я использую .Net MVC 4, у вас нет метода html.NameFor в MVC 3.Тем не менее, я считаю, что это можно сделать в MVC 3 следующим способом:

var propertyName = ExpressionHelper.GetExpressionText(propertyExpression);
5 голосов
/ 10 июня 2016

Вы можете использовать его в строке

Пример для элемента select

<select name="@Html.NameFor(m=> m.MyProperty)"
        id="@Html.IdFor(m=> m.MyProperty)"
        @Html.Raw(string.Join(" ", Html.GetUnobtrusiveValidationAttributes(Html.NameFor(m => m.MyProperty).ToString()).Select(x => x.Key.ToString() + "=\"" + x.Value + "\"")))
>
1 голос
/ 24 ноября 2011

Вот ссылка на опубликованный мной ответ, показывающий HtmlHelper, который я написал для обеспечения ненавязчивой проверки для выпадающих списков: Проверка выпадающего списка MVC 3 не работает для модели со сложным представлением

UPDATE

Вы пытаетесь получить атрибуты в HtmlHelper или в строке в вашем представлении?

Предполагая, что вы пытаетесь получить атрибуты в своем представлении, это проблема.

Во-первых, вы должны понимать, что ModelMetadata не представляет единый объект, доступный по всей вашей модели. Скорее, он представляет метаданные для определенного элемента, будь то ваша модель или любое свойство в модели. Лучшее описательное имя будет ObjectMetadata, поскольку ModelMetadata - это метаданные для указанного объекта, будь то модель, вложенная модель или определенное свойство.

ModelMetadata в представлении - это только метаданные для модели верхнего уровня. Вы должны получить ModelMetadata для свойства, с которым связан раскрывающийся список. Если вы используете помощника, то помощнику передаются правильные ModelMetadata как само собой разумеющееся. Если вы используете свое представление, вам нужно заниматься гимнастикой, чтобы получить правильные ModelMetadata, см., Например, мой ответ здесь: Проверка и редактирование «Изменяемого» / необязательного типа в Asp.net MVC 3

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