Подтвердить что ты не робот

DisplayFormat для TextBoxFor в MVC

Мне нужно округлить цифру 4 цифры до 2 цифр и показать в MVC 3 UI

Что-то вроде 58.8964 to 58.90

Пробовал после этого Как использовать редактор() в MVC для типа валюты/денег?, но не работает.

Как я использую TextBoxFor = > я удалил ApplyFormatInEditMode здесь. Даже Я попытался использовать ApplyFormatInEditMode, но ничего не работает. Показывающий меня 58.8964.

MyModelClass

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

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

Как я могу достичь этого раунда?

Я не могу использовать EditorFor (m = > m.TotalAmount) здесь, так как мне нужно передать некоторые htmlAttributes

Edit:

После отладки с исходным кодом MVC они внутренне используют

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

в MvcHtmlString InputHelper() метод InputExtension.cs, который принимает значение объекта как параметр и преобразование. Они не используют какой-либо формат отображения. Как мы можем исправить?

Мне удалось это сделать. Поскольку у меня есть пользовательский помощник, я могу справиться с приведенным ниже кодом.

 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);
   }
4b9b3361

Ответ 1

Вы должны использовать Html.EditorFor вместо Html.TextBoxFor, если вы хотите, чтобы пользовательский формат учитывался:

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

Также убедитесь, что для параметра ApplyFormatInEditMode установлено значение true:

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

Атрибут DisplayFormat предназначен для использования только с шаблонами-помощниками, такими как EditorFor и DisplayFor. Это рекомендуемый подход вместо использования TextBoxFor.

Ответ 2

Это работает в MVC5

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

Ответ 3

Попробуйте вот так:

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

Надеюсь, что это поможет.

Ответ 4

Если вам нужно больше контролировать отображаемое поле (по сравнению с встроенным шаблоном EditorFor), создайте собственный шаблон EditorFor самостоятельно. Внутри шаблона EditorFor встроенные html-помощники, такие как @Html.TextBox(), могут использоваться с автоматической проверкой на стороне клиента и атрибутами отображения, которые обычно доступны только для EditorFor и DisplayFor.

Например, цикл через список элементов. Имя ввода должно иметь неразрывный индекс.

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

Затем вы можете настроить свою модель

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

Шаблон EditorFor (например, ~/Views/Shared/EditorFor/MyCustomEditorTemplate.cshtml) Обратите внимание, что имя осталось пустым, оно исходит из fieldName автоматически. Вы можете увидеть его в ViewData.TemplateInfo.HtmlFieldPrefix. Теперь у вас есть полный контроль над отображением поля.

@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("")

Идея состоит в том, что вы можете настроить поле ввода, как бы вы хотели, и использовать, например. @Html.TextBox(), который вне настраиваемого шаблона EditorFor не будет использовать встроенную проверку на стороне клиента. Вам не нужно использовать настраиваемое имя поля ввода, это просто пример полезности этого решения. Вы можете настроить способ представления данных (CSS и т.д.) Вместо того, чтобы полагаться на встроенные шаблоны EditorFor.

Ответ 5

Я решаю эту проблему следующим образом:

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

или создать следующее расширение:

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);
    }
}

Но вам нужно установить ApplyFormatInEditMode = true в DisplayFormatAttribute в вашем поле.