2010-09-24 4 views
3

J'ai un facile pour vous les gars. À mon avis, j'ai une zone de texte, comme ça:MVC 2, affichage du modèle de format dans une zone de texte

<%= Html.TextBoxFor(x => x.Price, new { @class = "text tiny" })%> 

Le prix est un nombre décimal. Lorsque le formulaire se charge. la zone de texte affiche "0". Je voudrais qu'il affiche "0.00".

J'ai essayé <%= Html.TextBoxFor(x => String.Format("{0:0.00}", x.Price), new { @class = "text tiny" })%> qui a commis une erreur.

Les modèles peuvent être utilisés uniquement avec le champ accès, accès à la propriété, index de tableau à une dimension ou indexeur personnalisé unique paramètre expressions.

Répondre

3

Vous pouvez utiliser ModelMetadata. Certains des attributs de métadonnées sont EditFormatString et DisplayFormatString.

+0

J'ai ajouté l'attribut à mon modèle et il affiche toujours "0" – Josh

+0

Avez-vous changé le TextBoxFor à un EditorFor? –

4

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).

+0

J'ai utilisé Html.EditorFor et en combinaison avec la suggestion de RedFilter cela a fonctionné. – Josh

+0

@Josh - Ça marche bien. Cela vous permet d'avoir des formats séparés pour l'affichage et l'édition. Comme vous pouvez le voir, l'affichage est affiché avec le symbole de devise, mais il est omis lors de l'édition. – tvanfosson

3

J'ai trouvé les deux réponses précédentes utiles mais pour moi l'information clé nécessaire pour faire ce travail est que vous devez utiliser EditorFor au lieu de TextBoxFor. Textbox for ne semble pas ramasser le EditFormatString de ModelMetadata

Questions connexes