1

(bit,null) として定義されている W2_Sent というフィールドがあります。

私の見解では、チェックボックスとして表示する次のものがあります。

     <div class="editor-label"  style="width: 10em">                        
       @Html.Label("W2 Sent")
     </div>
     <div class="editor-field">
       @Html.EditorFor(model => model.W2_Sent)
       @Html.ValidationMessageFor(model => model.W2_Sent)
     </div>

確認したらエラー出てた

'checked' の値は W2_Sent には無効です

      [HttpPost]
      public ActionResult Create(Employee emp)
      {

        foreach (ModelState modelState in ViewData.ModelState.Values)
        {
            foreach (ModelError error in modelState.Errors)
            {

                string s = "error";

            }

        }

上記の foreach ループ内でエラーをトラップできます。

「チェック済み」の値が無効になるのはなぜですか

4

3 に答える 3

12

フォームにチェックボックスを表示する@Html.CheckBox/CheckBoxForには、 の代わりに常に使用する必要があり<input type="checkbox" name="gender" />ます。ASP.NET MVCを使用する@Html.CheckBox/CheckBoxForと、ブール値を持つ隠しフィールドが生成され、それがモデル プロパティにバインドされます。

html パーツを直接使用すると、ブラウザはフィールドの値を「チェック済み」の文字列として投稿し、モデル バインディングでエラーをスローします。

于 2012-07-26T03:15:13.393 に答える
4

私はこのようにしました。CheckBoxFor の独自の ExtensionMethod を記述します。トリックは、チェックボックスの "value" = "true" と隠しフィールドの "value" "false" の静的な値です。前述のように、値が false のチェックボックスは返されません。この場合、非表示フィールドの値が取得されます。ユーザーがチェックボックスをオンにすると、新しい「true」値が非表示フィールドの「false」を上書きします。

    public static MvcHtmlString CheckboxForMetro<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, int offset = 3)
    {
        TagBuilder tblabel = new TagBuilder("label");
        tblabel.AddCssClass("checkbox offset" + offset.ToString());

        TagBuilder tbinput = new TagBuilder("input");
        tbinput.Attributes.Add("type", "checkbox");
        tbinput.Attributes.Add("id", GetPropertyNameFromLambdaExpression(html, expression));
        tbinput.Attributes.Add("name", GetPropertyNameFromLambdaExpression(html, expression));
        tbinput.Attributes.Add("value", "true");
        tbinput.MergeAttributes(GetPropertyValidationAttributes(html, expression, null));
        if (GetPropertyValueFromLambdaExpression(html, expression) == "True") tbinput.Attributes.Add("checked", "checked");

        TagBuilder tbhidden = new TagBuilder("input");
        tbhidden.Attributes.Add("type", "hidden");
        tbhidden.Attributes.Add("value", "false");
        tbhidden.Attributes.Add("name", GetPropertyNameFromLambdaExpression(html, expression));

        TagBuilder tbspan = new TagBuilder("span");
        //tbspan.AddCssClass("span" + spanLabel.ToString());
        tbspan.InnerHtml = GetPropertyDisplayNameFromLambdaExpression(html, expression);
        tblabel.InnerHtml = tbinput.ToString() + tbspan.ToString() + tbhidden.ToString();

        return new MvcHtmlString(tblabel.ToString());
    }

これは、 http://metroui.org.uaにある Metro UI CSS の ExtensionMethod です。

これは、value、displayname、propertyname、および validationAttributes を取得するためのコードです。

    private static string GetPropertyDisplayNameFromLambdaExpression<TModel, TValue>(HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression)
    {
        ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
        string htmlFieldName = ExpressionHelper.GetExpressionText(expression);

        return metadata.DisplayName ?? metadata.PropertyName ?? htmlFieldName.Split('.').Last() ?? "Geen tekst";
    }

    private static string GetPropertyValueFromLambdaExpression<TModel, TValue>(HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression)
    {
        string value = string.Empty;
        TModel model = html.ViewData.Model;
        if (model != null)
        {
            var expr = expression.Compile().Invoke(model);
            if (expr != null)
            {
                value = expr.ToString();
            }
        }
        return value;
    }

    private static string GetPropertyNameFromLambdaExpression<TModel, TValue>(HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression)
    {
        ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
        return metadata.PropertyName;
    }

    private static IDictionary<string, object> GetPropertyValidationAttributes<TModel, TValue>(HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, IDictionary<string, object> htmlAttributes)
    {
        ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
        IDictionary<string, object> validationAttributes = html.GetUnobtrusiveValidationAttributes(ExpressionHelper.GetExpressionText(expression), metadata);
        if (htmlAttributes == null)
        {
            htmlAttributes = validationAttributes;
        }
        else
        {
            htmlAttributes = htmlAttributes.Concat(validationAttributes).ToDictionary(k => k.Key, v => v.Value);
        }
        return htmlAttributes;
    }

これが他の誰かに役立つことを願っています。

于 2012-11-27T13:04:04.320 に答える