MVC 2, Формат модели отображения в текстовое поле - PullRequest
3 голосов
/ 24 сентября 2010

У меня есть легкий вопрос для вас, ребята.На мой взгляд, у меня есть текстовое поле, например, так:

<%= 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 ]

4 голосов
/ 24 сентября 2010

Вот шаблон отображения денег:

<%@ 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; }
}

Затем подключите его в Global.asax.cs в Application_Start ()

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 голосов
/ 07 декабря 2010

Я нашел оба предыдущих ответа полезными, однако для меня ключевая часть информации, необходимой для этой работы, заключается в том, что вы должны использовать EditorFor вместо TextBoxFor.Похоже, что текстовое поле для не получает EditFormatString из ModelMetadata

3 голосов
/ 24 сентября 2010

Вы можете использовать ModelMetadata .Некоторые из атрибутов метаданных: EditFormatString и DisplayFormatString.

...