webdevqa.jp.net

MVCのTextBoxForのDisplayFormat

4桁の10進数を2桁に丸めて、MVC 3 UIに表示する必要があります

58.8964から58.90のようなもの

これに続いて試してみました 通貨/お金の種類にMVCでEditorFor()を使用する方法 が機能しません。

TextBoxFor =>を使用しているため、ここでApplyFormatInEditModeを削除しました。 ApplyFormatInEditModeで試しましたが、何も機能しません。まだ58.8964が表示されます。

MyModelClass

 [DisplayFormat(DataFormatString = "{0:F2}")]
 public decimal? TotalAmount { get; set; }

 @Html.TextBoxFor(m=>m.TotalAmount)

どうすればこのラウンドオフを達成できますか?

ここではEditorFor(m => m.TotalAmount)を使用できません。いくつかのhtmlAttributesを渡す必要があるためです

編集:

MVCソースコードでデバッグした後、内部的に使用します

 string valueParameter = Convert.ToString(value, CultureInfo.CurrentCulture);

オブジェクト値をパラメーターとして取り、変換するInputExtension.csのMvcHtmlString InputHelper()メソッドで。そこでは表示形式を使用していません。どうすれば修正できますか?

私はこの方法で修正することができました。私はカスタムヘルパーを持っているので、以下のコードで管理できます

 if (!string.IsNullOrEmpty(modelMetaData.DisplayFormatString))
   {
     string formatString = modelMetaData.DisplayFormatString;
     string formattedValue = String.Format(CultureInfo.CurrentCulture, formatString, modelMetaData.Model);
     string name = ExpressionHelper.GetExpressionText(expression);
     string fullName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name);
       return htmlHelper.TextBox(fullName, formattedValue, htmlAttributes);
   }
   else
   {
       return htmlHelper.TextBoxFor(expression, htmlAttributes);
   }
24

カスタム形式を考慮する場合は、Html.EditorForの代わりにHtml.TextBoxForを使用する必要があります。

@Html.EditorFor(m => m.TotalAmount)

ApplyFormatInEditModeがtrueに設定されていることも確認してください。

[DisplayFormat(DataFormatString = "{0:F2}", ApplyFormatInEditMode = true)]
public decimal? TotalAmount { get; set; }

DisplayFormat属性は、EditorForDisplayForなどのテンプレート化されたヘルパーでのみ使用することを目的としています。これは、TextBoxForを使用する代わりに推奨されるアプローチです。

21
Darin Dimitrov

これはMVC5で動作します

@Html.TextBoxFor(m => m.TotalAmount, "{0:0.00}")
47
Sam Sippe

このようにしてみてください:

@{
     var format = String.Format("{0:0.00}", Model.TotalAmount);
}
@Html.TextBoxFor(m => m.TotalAmount, format)

それが役に立てば幸い。

4

表示されているフィールドをさらに制御する必要がある場合(組み込みのEditorForテンプレートに対して)、カスタムEditorForテンプレートを自分で作成します。 EditorForテンプレート内では、@Html.TextBox()などの組み込みHtmlヘルパーをクライアント側の自動検証および属性の表示とともに使用できます。これらは通常、EditorForおよびDisplayForでのみ使用できます。

たとえば、アイテムのリストをループします。入力名には切れ目のないインデックスが必要です。

// Optional, if you require a custom input name for binding
String fieldName = String.Format("FieldNameForBinding[{0}].Property", index)

@Html.EditorFor(m => m.Property, "MyCustomEditorTemplate", fieldName)

その後、モデルをセットアップできます

[CustomValidation(..optional..)]
[DisplayFormat(DataFormatString = "{0:F2}", ApplyFormatInEditMode = true)]
public decimal? TotalAmount { get; set; }

EditorForテンプレート(例:〜/ Views/Shared/EditorFor/MyCustomEditorTemplate.cshtml)名前は空のままで、fieldNameから自動的に取得されます。 ViewData.TemplateInfo.HtmlFieldPrefixで確認できます。これで、フィールドの表示を完全に制御できます。

@model object
@{
    Decimal? actualValue = (Decimal?)Model;
}
// The TextBox and ValidationMessage "names" are empty, they are filled   
// from the htmlFieldName given via the @Html.EditorFor() call.
@Html.TextBox("", actualValue, new { @class = "cssClass" })
@Html.ValidationMessage("")

アイデアは、あなたが好きなように入力フィールドをカスタマイズし、例えばカスタムEditorForテンプレートのoutsideである@ Html.TextBox()は、組み込みのクライアント側検証を使用しません。入力フィールドのカスタム命名を使用する必要はありません。これは、このソリューションの有用性の単なる例です。組み込みのEditorForテンプレートに依存する代わりに、データの表示方法(CSSなど)をカスタマイズできます。

1
lko

この問題を次のように解決します。

@Html.TextBoxFor(model => model.dtArrivalDate, ModelMetadata.FromLambdaExpression(model => model.dtArrivalDate, ViewData).EditFormatString)

または、次の拡張子を作成します。

public static class HtmlExtensions
{
    public static MvcHtmlString TextBoxWithFormatFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes)
    {
        return htmlHelper.TextBoxFor(expression, ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData).EditFormatString, htmlAttributes);
    }
}

ただし、フィールドのDisplayFormatAttributeApplyFormatInEditMode=trueを設定する必要があります。

1