我有一个容易的人。在我看来,我有一个文本框,如下:
<%= Html.TextBoxFor(x => x.Price, new { @class = "text tiny" })%>
价格是小数。表单加载时。文本框显示“0”。我希望它显示“0.00”。
我尝试了<%= Html.TextBoxFor(x => String.Format("{0:0.00}", x.Price), new { @class = "text tiny" })%>
,这是错误的。
模板只能用于字段 访问,财产访问, 单维数组索引,或 单参数自定义索引器 表达式。
答案 0 :(得分:4)
这是一个Money显示模板:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<decimal?>" %>
<%= Html.TextBox( string.Empty, (Model.HasValue ? Model.Value.ToString("C") : string.Empty), new { @class = "money" } ) %>
和编辑模板
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<decimal?>" %>
<%= Html.TextBox( string.Empty, (Model.HasValue ? Model.Value.ToString("0.00") : string.Empty), new { @class = "money" } ) %>
我建议定义CSS类 money ,但如果需要,可以将其替换为其他类。将它们命名为 Money.ascx ,并将它们分别放在 Views \ Shared \ DisplayTemplates 和 Views \ Shared \ EditorTemplates 中。
用作
<%= Html.DisplayFor( x => x.Price, "Money" ) %>
<%= Html.EditorFor( x => x.Price, "Money" ) %>
编辑:如果你想拥有不同的编辑器/显示格式(就像我一样)你可以做的另一件事是扩展DataAnnotationsModelMetadataProvider,实现一个新的EditFormatAttribute,它在编辑模式下提供格式(这会覆盖DataAnnotations设置),通过两个属性提供显示格式和编辑格式。
public class ExtendedDataAnnotationsMetadataProvider : DataAnnotationsModelMetadataProvider
{
private HttpContextBase Context { get; set; }
public ExtendedDataAnnotationsMetadataProvider() : this( null ) { }
public ExtendedDataAnnotationsMetadataProvider( HttpContextBase httpContext )
{
this.Context = httpContext ?? new HttpContextWrapper( HttpContext.Current );
}
protected override ModelMetadata CreateMetadata( IEnumerable<Attribute> attributes, Type containerType, Func<object> modelAccessor, Type modelType, string propertyName )
{
List<Attribute> attributeList = new List<Attribute>( attributes );
var metadata = base.CreateMetadata( attributes, containerType, modelAccessor, modelType, propertyName );
EditFormatAttribute editFormatAttribute = attributeList.OfType<EditFormatAttribute>().FirstOrDefault();
if (editFormatAttribute != null)
{
metadata.EditFormatString = editFormatAttribute.EditFormatString;
}
// RequiredAdminAttribute requiredAdminAttribute = attributeList.OfType<RequiredAdminAttribute>().FirstOrDefault();
// if (requiredAdminAttribute != null)
// {
// metadata.IsRequired = this.Context.User == null || requiredAdminAttribute.RequiredForUser( this.Context.User );
// }
return metadata;
}
}
public class EditFormatAttribute : Attribute
{
public string EditFormatString { get; set; }
}
然后将它连接到Application_Start()
中的Global.asax.cs中ModelMetadataProviders.Current = new ExtendedDataAnnotationsMetadataProvider();
这允许您配置模型属性,如:
[DataType( DataType.Currency )]
[DisplayFormat( DataFormatString = "{0:C}", ApplyFormatInEditMode = false )]
[EditFormat( EditFormatString = "{0:0.00}" )]
public decimal? Amount { get; set; }
这使我能够摆脱上面展示的模板,并保留了将HTML属性轻松应用于生成的字段的能力。我认为它可能比必要的更复杂。我这样做是为了支持一个额外的属性,该属性支持基于用户是谁或他们的组成员身份的条件要求(在示例中注释掉)。
答案 1 :(得分:3)
您可以使用ModelMetadata。一些元数据属性是EditFormatString
和DisplayFormatString
。
答案 2 :(得分:3)
我发现以前的答案都很有用,但对我来说,完成这项工作所需的关键信息是你必须使用EditorFor而不是TextBoxFor。 Textbox for似乎没有从ModelMetadata中获取EditFormatString