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>

次のようなビューから呼び出すことで、機能するようになりました(どこCategoryに a があります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 に答える