Как я могу проверить результат в шаблоне редактора ASP.NET MVC?

StackOverflow https://stackoverflow.com/questions/2543575

Вопрос

Я создал шаблон редактора для представления выбора из динамического раскрывающегося списка, и он работает так, как должен, за исключением проверки, которую я не смог понять.Если модель имеет [Required] установлен атрибут, я хочу, чтобы он стал недействительным, если выбран вариант по умолчанию.

Объект модели представления, который должен быть представлен в виде раскрывающегося списка: Selector:

public class Selector
{
    public int SelectedId { get; set; }
    public IEnumerable<Pair<int, string>> Choices { get; private set; }
    public string DefaultValue { get; set; }

    public Selector()
    {
        //For binding the object on Post
    }

    public Selector(IEnumerable<Pair<int, string>> choices, string defaultValue)
    {
        DefaultValue = defaultValue;
        Choices = choices;
    }
}

Шаблон редактора выглядит следующим образом:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>
<select class="template-selector" id="<%= ViewData.ModelMetadata.PropertyName %>.SelectedId" name="<%= ViewData.ModelMetadata.PropertyName %>.SelectedId">
<%
    var model = ViewData.ModelMetadata.Model as QASW.Web.Mvc.Selector;
    if (model != null)
    {
            %>
    <option><%= model.DefaultValue %></option><%
        foreach (var choice in model.Choices)
        {
            %>
    <option value="<%= choice.Value1 %>"><%= choice.Value2 %></option><%
        }
    }
     %>
</select>

Я вроде как заставил его работать, вызвав его из такого представления (где Category это Selector):

<%= Html.ValidationMessageFor(n => n.Category.SelectedId)%>

Но он показывает ошибку проверки из-за отсутствия правильного номера, и его не волнует, установил ли я Required атрибут.

Это было полезно?

Решение

Я нашел решение, в котором проверка выполняется по скрытым полям с использованием пользовательских правил проверки, здесь.Используя этот подход, вы можете легко добавить собственную проверку к произвольным типам.

Другие советы

Почему ваш шаблон редактора не является строго типизированным?

<%@ Control Language="C#" 
    Inherits="System.Web.Mvc.ViewUserControl<QASW.Web.Mvc.Selector>" %>

Почему бы не использовать помощник DropDownListFor:

<%= Html.DropDownListFor(
    x => x.SelectedId, 
    new SelectList(Model.Choices, "Value1", "Value2")
)%>

Чтобы избежать волшебных строк, вы можете добавить свойство ChoicesList в свою модель представления:

public IEnumerable<SelectListItem> ChoicesList 
{
    get
    {
        return Choices.Select(x => new SelectListItem
        {
            Value = x.Value1.ToString(),
            Text = x.Value2
        });
    }
}

и привяжите к нему вашего помощника:

<%= Html.DropDownListFor(x => x.SelectedId, Model.ChoicesList) %>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top