26

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

像这样的东西 58.8964 到 58.90

尝试遵循此如何在 MVC 中将 EditorFor() 用于货币/货币类型?但不工作。

当我使用 TextBoxFor=> 时,我在这里删除了 ApplyFormatInEditMode。即使我尝试过 ApplyFormatInEditMode ,但没​​有任何效果。仍然显示 58.8964。

我的模型类

 [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);
   }
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 属性旨在仅与模板化帮助器一起使用,例如EditorForDisplayFor。这是推荐的方法,而不是使用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

如果您需要对正在显示的字段进行更多控制(与内置的 EditorFor 模板相比),请自行创建自定义 EditorFor 模板。在 EditorFor 模板中,内置的 Html Helpers like@Html.TextBox()可以与自动客户端验证和 Display 属性一起使用,这些属性通常仅适用于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("")

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

于 2013-10-16T08:01:55.513 回答
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=trueDisplayFormatAttribute的领域。

于 2015-04-15T22:58:17.897 回答