7

私は単純なドロップダウン リストを持っています。リストの最初の項目には空の値があります。リストで何も選択しないと、クライアントの検証で無視されます。注釈属性を使用して、モデルで必要に応じてそのフィールドを設定しました。

 @Html.DropDownListFor(model => Model.CCPayment.State, UnitedStatesStates.StateSelectList)



[Required(ErrorMessage = "State is Required.")]
    public string State
    {
        get
        {
            return _state;
        }
        set
        {
            _state = value;
        }
    }

何か案は?私は何かを逃していますか?

4

5 に答える 5

8

正当なバグのようです。検索で見つけた最善の回避策は次のとおりです。

http://forums.asp.net/t/1649193.aspx

要するに。問題の原因をカスタムHtml拡張機能でラップし、DropDownListFor次のような目立たないクライアント側の検証ルールを手動で取得します。

IDictionary<string, object> validationAttributes = htmlHelper.
    GetUnobtrusiveValidationAttributes(
        ExpressionHelper.GetExpressionText(expression),
        metadata
    );

validationAttributes次に、辞書をカスタムヘルパーに渡された他のhtml属性と組み合わせて、それをに渡します。DropDownListFor

私が使用している完全なコード(私もそこにラベルがあります、あなたは自由に分離することができます):

public static IHtmlString DropDownListWithLabelFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression, string label, IEnumerable<SelectListItem> items, string blankOption, object htmlAttributes = null)
{
    var l = new TagBuilder("label");
    var br = new TagBuilder("br");

    var metadata = ModelMetadata.FromLambdaExpression(expression, helper.ViewData);
    var mergedAttributes = helper.GetUnobtrusiveValidationAttributes(ExpressionHelper.GetExpressionText(expression), metadata);

    if (htmlAttributes != null)
    {
        foreach (PropertyDescriptor descriptor in TypeDescriptor.GetProperties(htmlAttributes))
        {
            object value = descriptor.GetValue(htmlAttributes);
            mergedAttributes.Add(descriptor.Name, value);
        }
    }

    l.InnerHtml = label + br.ToString(TagRenderMode.SelfClosing) + helper.DropDownListFor(expression, items, blankOption, mergedAttributes);
    return MvcHtmlString.Create(l.ToString(TagRenderMode.Normal));
}
于 2011-11-12T02:10:14.847 に答える
4

問題を特定するには、提供された情報が少なすぎます。ビュー内に目立たない適切な検証スクリプトを含めるのを忘れているかもしれませんが、誰が知っていますか?あなたはあなたの見解を示していません。

完全に機能する例を次に示します。

モデル:

public class MyViewModel
{
    [Required(ErrorMessage = "State is Required.")]
    public string State { get; set; }

    public IEnumerable<SelectListItem> States 
    { 
        get
        {
            return Enumerable.Range(1, 5).Select(x => new SelectListItem
            {
                Value = x.ToString(),
                Text = "state " + x
            });
        }
    }
}

コントローラ:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View(new MyViewModel());
    }

    [HttpPost]
    public ActionResult Index(MyViewModel model)
    {
        return View(model);
    }
}

意見:

@model AppName.Models.MyViewModel
@{
    ViewBag.Title = "Home Page";
}
<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script>

@using (Html.BeginForm())
{
    @Html.LabelFor(x => x.State)
    @Html.DropDownListFor(
        x => x.State, 
        new SelectList(Model.States, "Value", "Text"), 
        "-- Please select a state --"
    )
    @Html.ValidationMessageFor(x => x.State)
    <input type="submit" value="OK" />
}

DropDownListFor最後のパラメーターとしてヘルパーにデフォルト値を提供していることに注目してください。これにより、最初に空の値とカスタムテキストでオプションが挿入され、ユーザーがいくつかの状態を選択しない場合は、必要なバリデーターが起動する必要があります。

于 2011-01-26T08:37:25.713 に答える
2

コードプレックスhttp://aspnet.codeplex.com/workitem/7629のスレッドで誰かが言ったように、属性に @class="required" を追加しましたが、うまくいきました =)

于 2011-09-21T15:08:35.087 に答える
1

これは私が見つけた最も簡単な方法で、ビュー内のofにdata-val-*-*属性を追加するだけです。次のメソッドは RemoteValidation でも機能します。リモート検証が必要ない場合は、次を含む要素を削除するだけです。HtmlAttributesDropDownListFordata-val-remote-*

        @Html.DropDownListFor(m => m.yourlistID, (IEnumerable<SelectListItem>)ViewBag.YourListID, String.Empty, 
        new Dictionary<string, object>() { { "data-val", "true" }, 
        { "data-val-remote-url", "/Validation/yourremoteval" }, 
        { "data-val-remote-type", "POST" }, { "data-val-remote-additionalfield", "youradditionalfieldtovalidate" } })

それが役立つことを願っています。よろしくお願いします!

于 2012-02-17T11:06:14.050 に答える