我需要将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);
}
答案 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属性仅适用于EditorFor
和DisplayFor
等模板化帮助程序。这是推荐的方法,而不是使用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
。