4

しばらくウェブを見回しましたが、特定の問題に対する適切な解決策が見つかりません。私は MVC3 Razor アプリに取り組んでいます。クライアント側でもjQueryを使用して多くのことを行っているため、この場合、入力フィールドにhtml Id属性が必要です。

この特定の問題では、TextBoxFor を使用して通貨 (型は 10 進数) を表示すると、値は小数点以下 4 桁でレンダリングされます (2 だけが必要です)。モデル属性を入れました

[DisplayFormat(DataFormatString = "{0:n2}", ApplyFormatInEditMode = true)]

レンダリングすると、この「displayFormat」は無視されるようです。この問題が TextBoxFor html ヘルパーに存在することを確認する他の投稿をオンラインで見ました。

一方、EditorFor html ヘルパーを使用するように変更できます。DisplayFormat モデル属性は、テキスト ボックスの値を小数点以下 2 桁にフォーマットするために機能します。欠点は、jQuery に必要な html ヘルパーに html 属性を適用する機能が失われていることです。両方の長所を活かす最善の方法は何ですか? たくさんの回避策を見てきましたが、これを行うためのより簡単な方法があるに違いないようです。

補足として、私の特定のプロジェクトでは、クライアント側の jQuery 操作を実行できるように、ほとんどのフィールドに html Id 属性と、場合によってはクラスが必要です。これが、EditorFor html ヘルパーを拡張して html 属性も受け入れるかどうかに集中する必要があることを意味するかどうかはわかりません。

4

3 に答える 3

2

DisplayFormatDisplayかみそりの拡張メソッドのいずれかで MVC によってのみ使用されます。( などDisplayFor)残念ながら、やりたいことを行うには、「手動で」コードを作成する必要があります...次の例を参考にしてください。これは基本的に TextBoxFor コードを再現しますが、本番環境ではおそらく良くない仮定をいくつか行っています。以下の割り当てに注意してください。ここで、実際に your に設定された you をdisplayText気にします。DisplayFormatStringDisplayFormat

あなたの見解でそれを呼び出すには@Html.TextEditorFor(m => m.Value)

public static class CustomEditorFor
{
    public static IHtmlString TextEditorFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes)
    {
        return TextEditorFor(helper, expression, HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes));
    }

    public static IHtmlString TextEditorFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression, IDictionary<string, object> htmlAttributes)
    {
        ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, helper.ViewData);
        object value = metadata.Model;
        string displayText = string.Format(metadata.DisplayFormatString, value);

        string fullName = helper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(ExpressionHelper.GetExpressionText(expression));

        TagBuilder tagBuilder = new TagBuilder("input");
        tagBuilder.MergeAttributes(htmlAttributes);
        tagBuilder.MergeAttribute("type", "text");
        tagBuilder.MergeAttribute("name", fullName, true);

        tagBuilder.MergeAttribute("value", displayText);
        tagBuilder.GenerateId(fullName);
        ModelState modelState;
        if (helper.ViewData.ModelState.TryGetValue(fullName, out modelState))
        {
            if (modelState.Errors.Count > 0)
            {
                tagBuilder.AddCssClass(HtmlHelper.ValidationInputCssClassName);
            }
        }

        tagBuilder.MergeAttributes(helper.GetUnobtrusiveValidationAttributes(ExpressionHelper.GetExpressionText(expression), metadata));

        return new HtmlString(tagBuilder.ToString(TagRenderMode.SelfClosing));

    }
}
于 2012-05-30T01:32:26.377 に答える
0

ここでの簡単な解決策は、カスタム通貨タイプのカスタム表示およびエディターテンプレートを作成することです。これを行う。

public class MyModel {
    [DataType(DataType.Currency)]
    public decimal mycurrency {get;set;}
}

次に、〜/ Views / Shared / EditorTemplates / Currency.cshtml(またはDisplayTemplates)で

@model decimal?

@Html.TextBox("", string.Format("{0:0.00}", Model), new { whateveryourattributes="attributevalues"})

次に、DisplayForやEditorForなどを使用できます。

于 2012-07-01T20:38:10.800 に答える
0

結局、Telerik の Numeric Textbox コントロールを使用しました。上記の両方の回答で、小数点の書式が修正されると確信しています。

モデルの検証に戻る必要があります。EditorFor htmlヘルパーが検証のためにモデルのデータ注釈をプルするのに問題がありましたが、TextBoxForで同じことをしていませんでした。しかし同時に、EditorFor ヘルパーの欠点は、jQuery に必要な HtmlAttributes を受け入れませんでした。

MVC4 RC を使い始めたので、これらの多くがバージョン 4 で修正されることを願っています。

于 2012-07-26T14:24:33.627 に答える