代码之家  ›  专栏  ›  技术社区  ›  Josh

MVC 2,将模型显示格式设置为文本框

  •  3
  • Josh  · 技术社区  · 14 年前

    我有一个简单的给你们。在我看来,我有一个文本框,就像这样:

    <%= 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" })%> 它出错了。

    模板只能与字段一起使用 访问,属性访问, 一维数组索引,或 单参数自定义索引器 表达。

    3 回复  |  直到 14 年前
        1
  •  3
  •   D'Arcy Rittich    14 年前

    你可以用 ModelMetadata . 一些元数据属性是 EditFormatString DisplayFormatString .

        2
  •  4
  •   tvanfosson    14 年前

    这是一个货币显示模板:

    <%@ 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类 ,但如果需要,可以用其他类替换它。两个都叫 金钱.ascx 把它们放进去 视图\共享\显示模板 视图\共享\编辑模板 ,分别。

    用作

    <%= Html.DisplayFor( x => x.Price, "Money" ) %>
    <%= Html.EditorFor( x => x.Price, "Money" ) %>
    

    编辑 :如果希望具有不同的编辑器/显示格式(与我一样),则可以执行的另一项操作是扩展DataAnnotationsModelMetadataProvider,实现新的EditFormattribute,该属性在编辑模式下提供格式(这将覆盖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; }
    }
    

    然后在应用程序的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属性应用于生成的字段的能力。我认为这可能比必要的更复杂。我这样做是为了支持一个额外的属性,该属性支持基于用户是谁或其组成员身份的条件要求(在示例中注释掉)。

        3
  •  3
  •   Twisted    14 年前

    我发现前面的两个答案对我都很有用,但是对于我来说,使这项工作成功所需的关键信息是,您必须使用editor for而不是textbox for。的文本框似乎没有从ModelMetadata中提取EditFormatString