26

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)

このラウンドオフを達成するにはどうすればよいですか?

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

編集:

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);
   }
4

5 に答える 5

53

これはMVC5で動作します

@Html.TextBoxFor(m => m.TotalAmount, "{0:0.00}")
于 2014-07-10T06:20:54.820 に答える
21

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

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

ApplyFormatInEditModeまた、trueに設定されていることを確認してください。

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

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

于 2013-02-05T07:48:07.593 に答える
4

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

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

それが役に立てば幸い。

于 2013-02-05T06:24:57.440 に答える
1

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

@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);
    }
}

しかし、あなたは自分のフィールドに着手する必要がありApplyFormatInEditMode=trueますDisplayFormatAttribute

于 2015-04-15T22:58:17.897 に答える
1

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

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

// 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 テンプレートの外部では組み込みのクライアント側検証を利用しない @Html.TextBox() などを使用できるということです。入力フィールドのカスタム命名を使用する必要はありません。これは、このソリューションの有用性の単なる例です。組み込みの EditorFor テンプレートに依存する代わりに、データの表示方法 (CSS など) をカスタマイズできます。

于 2013-10-16T08:01:55.513 に答える