0

我已经创建了一个编辑器模板,用于表示从动态下拉列表中进行选择,它可以正常工作,但验证除外,我一直无法弄清楚。如果模型[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>

我通过从这样的视图中调用它来让它工作(在哪里Categorya Selector):

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

但它显示了未提供正确数字的验证错误,并且它不在乎我是否设置了Required属性。

4

2 回答 2

2

我在这里找到了一个解决方案,其中使用自定义验证规则对隐藏字段进行验证。使用这种方法,您可以轻松地将自定义验证添加到任意类型。

于 2010-04-05T20:17:05.790 回答
0

为什么你的编辑器模板不是强类型的?

<%@ 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) %>
于 2010-03-30T09:44:15.080 回答