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

MVC3 Десятичное усечение до 2 знаков после запятой при редактировании

Я запускаю MVC3 с Razor и замечаю, что десятичные значения усекаются до 2 десятичных знаков в режиме редактирования. Мне удалось обойти это, аннотируя мою собственность с помощью формата отображения. Это не похоже на очень хорошее решение, так как мне нужно будет запомнить это для каждого нового представления, которое я создаю (или обновлять свои шаблоны).

Я проверил значение, возвращаемое нашей службой контроллеру, и это правильно в 1.144, но когда привязано к представлению, оно появляется как 1.14 в TextBox

Свойство ViewModel

[Required]
[Display(Name = "Unit Price")]
public decimal UnitPrice { get; set; }

.cshtml Код

@Html.LabelFor(model => model.UnitPrice) 
@Html.EditorFor(model => model.UnitPrice) 
@Html.ValidationMessageFor(model => model.UnitPrice)

Если я украшаю свойство следующим, то он работает.

[DisplayFormat(
               ApplyFormatInEditMode = true, 
               DataFormatString = "{0:0.00###########################}", 
               NullDisplayText = "")]

Любые идеи?

4b9b3361

Ответ 1

То, как определено десятичный шаблон редактора:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>
<script runat="server">
    private object ModelValue {
        get {
            if (ViewData.TemplateInfo.FormattedModelValue == ViewData.ModelMetadata.Model) {
                return String.Format(
                    System.Globalization.CultureInfo.CurrentCulture,
                    "{0:0.00}", ViewData.ModelMetadata.Model
                );
            }
            return ViewData.TemplateInfo.FormattedModelValue;
        }
    }
</script>
<%= Html.TextBox("", ModelValue, new { @class = "text-box single-line" }) %>

Обратите внимание на формат {0:0.00}.

Итак, у вас есть две возможности:

  • Используйте double вместо decimal как тип вашей модели.
  • Измените шаблон редактора по умолчанию, создав пользовательский ~/Views/Shared/EditorTemplates/Decimal.cshtml, который может выглядеть примерно так:

    @Html.TextBox(
        "", 
        ViewData.TemplateInfo.FormattedModelValue, 
        new { @class = "text-box single-line" }
    )
    

Возможно, вам захочется также изменить шаблон отображения.

Ответ 2

Если вам не нужны функции "EditorFor" HtmlHelper, вы можете просто заменить его на "TextBoxFor" и не урезать свое десятичное значение...

Ответ 3

IMO, эта статья имеет лучший вариант:

html-editorfor-with-3-decimal-places

Я использовал этот код для отображения до 4 десятичных цифр в моей EditFor:

    [Display(Name = "Discount Percentage")]
    [Range(0, 100.0)]
    [DisplayFormat(DataFormatString="{0:0.0000}", ApplyFormatInEditMode=true)]
    public Decimal? DiscountPercent { get; set; }