用于MVC中TextBoxFor的DisplayFormat

时间:2013-02-05 05:39:09

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-4

我需要将4位十进制四舍五入为2位并在MVC 3 UI中显示

像这样58.8964到58.90

尝试遵循此How should I use EditorFor() in MVC for a currency/money type?但不起作用。

  

因为我正在使用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);
   }

5 个答案:

答案 0 :(得分:46)

这适用于MVC5

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

答案 1 :(得分:21)

如果您想要考虑自定义格式,则应使用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

答案 2 :(得分:4)

试试这样:

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

希望它有所帮助。

答案 3 :(得分:1)

如果您需要对显示的字段进行更多控制(与内置的EditorFor模板相比),请自行创建自定义EditorFor模板。在EditorFor模板中,内置的Html Helpers(如@Html.TextBox())可用于自动客户端验证和显示属性,这些通常仅适用于EditorFor和{{1} }。

例如循环浏览项目列表。输入名称必须具有不间断的索引。

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)

EditorFor模板(例如〜/ Views / Shared / EditorFor / MyCustomEditorTemplate.cshtml) 请注意,该名称为空,它自动来自[CustomValidation(..optional..)] [DisplayFormat(DataFormatString = "{0:F2}", ApplyFormatInEditMode = true)] public decimal? TotalAmount { get; set; } 。您可以在fieldName中看到它。现在您可以完全控制字段的显示。

ViewData.TemplateInfo.HtmlFieldPrefix

您的想法是,您可以根据需要自定义输入字段,并使用例如@ Html.TextBox()自定义EditorFor模板的外部不会使用内置的客户端验证。您不需要使用输入字段的自定义命名,这只是该解决方案有用的一个示例。您可以自定义数据的呈现方式(CSS等),而不是依赖于内置的EditorFor模板。

答案 4 :(得分: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