Вот шаблон отображения денег:
<%@ 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 к сгенерированным полям. Я думал, что это может быть более сложным, чем необходимо. Я сделал это для поддержки дополнительного атрибута, который поддерживает условные требования, основанные на том, кто пользователь или членство в группе (закомментировано в примере).