Аннотация данных для формата валюты не работает

В моем веб-проекте ASP.NET MVC Core на VS2015 следующая модель отображает данные как, например, 15481 вместо $15 481, хотя я использую [DisplayFormat] ниже:

Модели:

public class State
{
    [Key]
    public int StateId { get; set; }

    [Column(TypeName ="varchar(40)")]
    public string StateName { get; set; }

    [Column(TypeName = "char(2)")]
    public string StateCode { get; set; }
}

public class Sales
{
    [Key]
    public int SalesId { get; set; }
    public int? FiscalYear { get; set; }

    [DisplayFormat(DataFormatString = "{(0:C0)}")]
    public float? SaleAmount { get; set; }

    public int StateId { get; set; }
    public State State { get; set; }
}

МодельВью:

public class StatesSalesViewModel
{
    [HiddenInput]
    public int StateId { get; set; }

    [Display(Name ="State")]
    public string StateName { get; set; }
    public int? FiscalYear { get; set; }

    [DisplayFormat(DataFormatString = "{(0:C0)}")]
    public float? SaleAmount { get; set; }
}

Контроллер:

public async Task<IActionResult> FYSales(List<StatesSalesViewModel> model, string GO, int currentlySelectedIndex, string returnUrl = null)
{
    ViewData["ReturnUrl"] = returnUrl;
    ViewBag.YearsList = Enumerable.Range(1996, 29).Select(g => new SelectListItem { Value = g.ToString(), Text = g.ToString() }).ToList();

    if (!string.IsNullOrEmpty(GO))
    {
        var qryVM = from s in _context.States
                    join g in _context.Sales on s.StateId equals g.StateId
                    where g.FiscalYear == currentlySelectedIndex
                    select new StatesSalesViewModel() {StateId = s.StateId, StateName = s.StateName, SaleAmount = g.SaleAmount , FiscalYear = currentlySelectedIndex };

        return View(qryVM.ToList());
    }
}

Просмотр:

@model IList<mProject.Models.StatesSalesViewModel>

<div class="row">
    <div class="col-md-12">
        <form asp-controller="StatesSales" asp-action="getSales" asp-route-returnurl="@ViewData["ReturnUrl"]" method="post">
            @{
                IEnumerable<SelectListItem> yearsList = (IEnumerable<SelectListItem>)ViewBag.YearsList;
                var currentlySelectedIndex = 0; // Currently selected index (usually will come from model)
            }
            <strong>Select a Post Year</strong>
            <h6>Choose a year o begin:</h6>
            <label>Year:</label><select asp-for="@currentlySelectedIndex" asp-items="yearsList"></select><input type="submit" class="btn btn-default" name="GO" value="GO" />
            <table class="table">
                <thead>
                    <tr>
                        <th></th>
                        <th></th>
                        <th>Fiscal Year</th>
                        <th>State</th>
                        <th>Sales</th>
                    </tr>
                </thead>
                <tbody>
                    @for (int i=0; i< Model.Count(); i++)
                    {
                        <tr>
                            <td>@Html.HiddenFor(r => r[i].StateID)</td>
                            <td>@Html.HiddenFor(r => r[i].FYSalesID)</td>
                            <td>
                                @Html.TextBoxFor(r => r[i].FiscalYear)
                            </td>
                            <td>
                                @Html.TextBoxFor(r => r[i].StateName)
                            </td>
                            <td>
                                @Html.TextBoxFor(r => r[i].SaleAmount)
                            </td>
                        </tr>
                    }
                </tbody>
            </table>
            <button type="submit" class="btn btn-default">Save</button>
        </form>
    </div>
</div>

person nam    schedule 20.09.2016    source источник


Ответы (2)


Атрибут [DisplayFormat] учитывается только при использовании @Html.DisplayFor() или @Html.EditorFor(). Игнорируется при использовании TextBoxFor().

Кроме того, если вы хотите использовать его с @Html.EditorFor(r => r[i].SaleAmount), вам необходимо изменить атрибут, чтобы включить режим ApplyFormatInEditMode свойство

[DisplayFormat(DataFormatString = "{0:C0}", ApplyFormatInEditMode = true)]
public float? SaleAmount { get; set; }

однако это было бы мало полезно для вас, потому что, хотя оно будет отображаться в текстовом поле правильно, оно не будет привязано к вашему свойству float, если вы также не создадите пользовательскую привязку модели, которая преобразует (скажем) "$15,481" обратно в float

person Community    schedule 20.09.2016
comment
Есть ли обходной путь, чтобы не использовать привязку пользовательской модели. Вместо float? я попробовал decimal? и int?, но в обоих случаях я получил ту же ошибку в строке @Html.TextBoxFor(r => r[i].SaleAmount) представления: FormatException: Input string was not in a correct format. я удалил базу данных и повторно запустил команды add-migration и update-database в консоли диспетчера пакетов, прежде чем изменить число с плавающей запятой на десятичное и целое . - person nam; 21.09.2016
comment
Вы не можете использовать TextBoxFor(), как я объяснил. И не имеет значения, используете ли вы float или decimal или любой другой числовой тип. Если значение в вашем текстовом поле (например, $15,481) не может быть преобразовано в числовой тип, тогда вам нужен пользовательский связыватель модели (и чтобы проверить его, попробуйте использовать float.Parse("$15,481"); - это не удается, потому что его нельзя преобразовать в float) - person ; 21.09.2016
comment
Я забыл упомянуть, что я изменил TextBoxFor на EditorFor до того, как получил указанное выше исключение. - person nam; 21.09.2016

Можно использовать аннотацию валюты. Однако он просто сообщает MVC, какой шаблон отображения или редактора использовать. Как мы уже говорили, текущий шаблон использует системную валюту. Вам нужно будет предоставить пользовательский шаблон редактора или шаблон отображения и какой-либо другой способ определить символ валюты для отображения. templates-part-1-introduction.html" rel="nofollow noreferrer">Посмотрите здесь, как предоставить свои собственные реализации

Попробуйте использовать это

 [DisplayFormat(DataFormatString = "{0:C0}")]

Пример

public class Sales
{
    [Key]
    public int SalesId { get; set; }

    [DisplayFormat(DataFormatString = "{0:C0}")]
    public float? SaleAmount { get; set; }
}

Подробнее здесь

person MANISH KUMAR CHOUDHARY    schedule 20.09.2016
comment
Это не работает (возможно, потому что я использую другой шаблон). Данные отображаются правильно, но в формате просто числа. Также обратите внимание, что data type в базе данных SQL Server равно real. Я добавил Controller и View в сообщение - на случай, если это поможет. - person nam; 21.09.2016