DisplayFormat为TextBoxFor在MVC(DisplayFormat for Tex

2019-07-19 06:54发布

我需要4位小数四舍五入到2个位数,显示在MVC 3 UI

事情是这样的58.8964至58.90

尝试下面这个我应该如何使用EditorFor()在MVC的货币/货币类型? 但不工作。

由于我使用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);

在MvcHtmlString InputHelper()InputExtension.cs的方法,它接受对象的值作为参数和转换。 他们没有使用任何有显示格式。 我们怎么能解决?

我设法用这种方式来解决。 因为我有一个自定义的帮手,我可以能够与下面的代码管理

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

Answer 1:

您应该使用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



Answer 2:

这部作品在MVC5

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


Answer 3:

尝试这样的:

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

希望能帮助到你。



Answer 4:

如果你需要的领域进行更多的控制显示(与在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模板(例如,在〜/查看/共享/ 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模板不会利用内置的客户端验证。 你并不需要使用输入字段的自定义命名,这只是该解决方案的有效性的一个例子。 您可以自定义的,而不是依靠内置的EditorFor模板中的数据呈现方式(CSS等)。



Answer 5:

我解决这样这个问题:

@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在你的领域。



文章来源: DisplayFormat for TextBoxFor in MVC