web-dev-qa-db-fra.com

DisplayFormat pour TextBoxFor dans MVC

Je dois arrondir la décimale à 4 chiffres à 2 chiffres et l'afficher dans l'interface utilisateur MVC 3

Quelque chose comme ça 58.8964 à 58.90

Essayé après cela Comment dois-je utiliser EditorFor () dans MVC pour un type de devise/monnaie? mais ne fonctionne pas.

Comme j'utilise TextBoxFor => j'ai supprimé ApplyFormatInEditMode ici. Même j'ai essayé avec ApplyFormatInEditMode, mais rien ne fonctionne. Me montrant toujours 58.8964.

MyModelClass

 [DisplayFormat(DataFormatString = "{0:F2}")]
 public decimal? TotalAmount { get; set; }

 @Html.TextBoxFor(m=>m.TotalAmount)

Comment puis-je réaliser cet arrondi?

Je ne peux pas utiliser EditorFor (m => m.TotalAmount) ici, car j'ai besoin de passer quelques htmlAttributes

Modifier:

Après le débogage avec le code source MVC, ils utilisent en interne

 string valueParameter = Convert.ToString(value, CultureInfo.CurrentCulture);

dans la méthode MvcHtmlString InputHelper () de InputExtension.cs qui prend la valeur de l'objet comme paramètre et conversion. Ils n'utilisent aucun format d'affichage là-bas. Comment pourrions-nous y remédier?

J'ai réussi à réparer de cette façon. Comme j'ai un assistant personnalisé, je peux gérer avec le code ci-dessous

 if (!string.IsNullOrEmpty(modelMetaData.DisplayFormatString))
   {
     string formatString = modelMetaData.DisplayFormatString;
     string formattedValue = String.Format(CultureInfo.CurrentCulture, formatString, modelMetaData.Model);
     string name = ExpressionHelper.GetExpressionText(expression);
     string fullName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name);
       return htmlHelper.TextBox(fullName, formattedValue, htmlAttributes);
   }
   else
   {
       return htmlHelper.TextBoxFor(expression, htmlAttributes);
   }
24
Murali Murugesan

Tu devrais utiliser Html.EditorFor au lieu de Html.TextBoxFor si vous souhaitez que le format personnalisé soit pris en compte:

@Html.EditorFor(m => m.TotalAmount)

Assurez-vous également que vous avez défini ApplyFormatInEditMode sur true:

[DisplayFormat(DataFormatString = "{0:F2}", ApplyFormatInEditMode = true)]
public decimal? TotalAmount { get; set; }

L'attribut DisplayFormat est destiné à être utilisé uniquement avec des modèles d'aide tels que EditorFor et DisplayFor. Il s'agit de l'approche recommandée au lieu d'utiliser TextBoxFor.

21
Darin Dimitrov

Cela fonctionne dans MVC5

@Html.TextBoxFor(m => m.TotalAmount, "{0:0.00}")
47
Sam Sippe

Essayez comme ceci:

@{
     var format = String.Format("{0:0.00}", Model.TotalAmount);
}
@Html.TextBoxFor(m => m.TotalAmount, format)

J'espère que ça aide.

4
Karthik Chintala

Si vous avez besoin de plus de contrôle sur le champ affiché (par rapport à un modèle EditorFor intégré), créez vous-même un modèle EditorFor personnalisé. Dans un modèle EditorFor, les assistants HTML intégrés comme @Html.TextBox() peuvent être utilisés avec validation automatique côté client et attributs d'affichage qui ne sont généralement disponibles que pour EditorFor et DisplayFor.

Par exemple, parcourir une liste d'éléments. Le nom d'entrée doit avoir un index ininterrompu.

// Optional, if you require a custom input name for binding
String fieldName = String.Format("FieldNameForBinding[{0}].Property", index)

@Html.EditorFor(m => m.Property, "MyCustomEditorTemplate", fieldName)

Ensuite, vous pouvez configurer votre modèle

[CustomValidation(..optional..)]
[DisplayFormat(DataFormatString = "{0:F2}", ApplyFormatInEditMode = true)]
public decimal? TotalAmount { get; set; }

Le modèle EditorFor (par exemple ~/Views/Shared/EditorFor/MyCustomEditorTemplate.cshtml) Notez que le nom est laissé vide, il provient automatiquement du fieldName. Vous pouvez le voir dans le ViewData.TemplateInfo.HtmlFieldPrefix. Vous avez maintenant un contrôle total sur l'affichage du champ.

@model object
@{
    Decimal? actualValue = (Decimal?)Model;
}
// The TextBox and ValidationMessage "names" are empty, they are filled   
// from the htmlFieldName given via the @Html.EditorFor() call.
@Html.TextBox("", actualValue, new { @class = "cssClass" })
@Html.ValidationMessage("")

L'idée est que vous pouvez personnaliser le champ de saisie comme vous le souhaitez et utiliser par exemple @ Html.TextBox () qui extérieur d'un modèle EditorFor personnalisé n'utiliserait pas la validation côté client intégrée. Vous n'avez pas besoin d'utiliser la dénomination personnalisée du champ de saisie, c'était simplement un exemple de l'utilité de cette solution. Vous pouvez personnaliser la façon dont les données sont présentées (CSS, etc.) au lieu de compter sur les modèles EditorFor intégrés.

1
lko

Je résous ce problème de cette façon:

@Html.TextBoxFor(model => model.dtArrivalDate, ModelMetadata.FromLambdaExpression(model => model.dtArrivalDate, ViewData).EditFormatString)

ou créez l'extension suivante:

public static class HtmlExtensions
{
    public static MvcHtmlString TextBoxWithFormatFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes)
    {
        return htmlHelper.TextBoxFor(expression, ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData).EditFormatString, htmlAttributes);
    }
}

Mais vous devez définir ApplyFormatInEditMode=true dans DisplayFormatAttribute dans votre champ.

1
Yury Dzhantuganov