MVC 2,格式模型显示到文本框中

时间:2010-09-24 17:00:54

标签: asp.net-mvc-2 formatting textbox decimal

我有一个容易的人。在我看来,我有一个文本框,如下:

<%= 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 个答案:

答案 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。一些元数据属性是EditFormatStringDisplayFormatString

答案 2 :(得分:3)

我发现以前的答案都很有用,但对我来说,完成这项工作所需的关键信息是你必须使用EditorFor而不是TextBoxFor。 Textbox for似乎没有从ModelMetadata中获取EditFormatString