est ici un modèle d'affichage de l'argent:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<decimal?>" %>
<%= Html.TextBox(string.Empty, (Model.HasValue ? Model.Value.ToString("C") : string.Empty), new { @class = "money" }) %>
et éditeur de modèle
<%@ 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" }) %>
Je vous suggère de définir la classe CSS argent, mais vous pouvez le remplacer par les autres classes si vous vouloir. Nommez-les tous les deux Money.ascx et placez-les dans Views \ Shared \ DisplayTemplates et Vues \ Shared \ EditorTemplates, respectivement.
Utilisé comme
<%= Html.DisplayFor(x => x.Price, "Money") %>
<%= Html.EditorFor(x => x.Price, "Money") %>
EDIT: autre chose que vous pouvez faire si vous voulez avoir différents formats éditeur/affichage (comme je le fais) est de prolonger la DataAnnotationsModelMetadataProvider, mettre en œuvre une nouvelle EditFormatAttribute qui fournit la formatage en mode d'édition (ceci remplace le paramètre DataAnnotations), la fourniture à la fois un format d'affichage et un format d'édition via les deux attributs.
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; }
}
crochet Ensuite, en Global.asax.cs dans Application_Start()
ModelMetadataProviders.Current = new ExtendedDataAnnotationsMetadataProvider();
Cela vous permet de configurer les propriétés de votre modèle comme:
[DataType(DataType.Currency)]
[DisplayFormat(DataFormatString = "{0:C}", ApplyFormatInEditMode = false)]
[EditFormat(EditFormatString = "{0:0.00}")]
public decimal? Amount { get; set; }
Cela m'a permis d'obtenir débarrasser des modèles que j'ai montrés ci-dessus et conserver la capacité d'appliquer facilement des attributs HTML aux champs générés. Je pensais que cela pourrait être plus complexe que nécessaire. Je l'ai fait pour prendre en charge un attribut supplémentaire qui prend en charge l'exigence conditionnelle en fonction de l'identité de l'utilisateur ou de son appartenance à un groupe (commentée dans l'échantillon).
J'ai ajouté l'attribut à mon modèle et il affiche toujours "0" – Josh
Avez-vous changé le TextBoxFor à un EditorFor? –