2016-09-20 3 views
0

В моем веб-проекта ASP.NET MVC Core на VS2015, следующая модель отображения данных в виде, например, 15481 вместо $ 15481, даже если я использую [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; } 
} 

ModelView:

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> 

ответ

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

+1

Есть ли обходной путь для использования нестандартного связующего. Вместо 'float?', Я попробовал 'decimal?' И 'int?', Но в обоих случаях я получил ту же ошибку в '@ Html.TextBoxFor (r => r [i] .SaleAmount)' строка View: 'FormatException: строка ввода не была в правильном формате.« Я удалил базу данных и повторно запустил команды «add-migration» и «update-database» на консоли диспетчера пакетов, прежде чем менять float на десятичные и int. – nam

+0

Вы не можете использовать 'TextBoxFor()', как я объяснил. И не имеет значения, используете ли вы 'float' или' decimal' или любой другой числовой тип. Если значение в вашем текстовом поле (например, $ 15,481') не может быть преобразовано в числовой тип, тогда вам понадобится настраиваемое связующее устройство (и для его проверки попробуйте использовать 'float.Parse ("$ 15,481"); '- он терпит неудачу, потому что он не может быть преобразован в' float') –

+0

Я забыл упомянуть, что я изменил 'TextBoxFor' на' EditorFor', прежде чем я получил вышеописанное исключение. – nam

0

валюта аннотаций можно использовать. Однако это просто говорит MVC, который отображает или редактирует шаблон для использования. Как мы сказали, текущий шаблон использует системную валюту. Вам нужно будет предоставить настраиваемый шаблон редактора или шаблон отображения и другой способ определения отображаемого символа валюты. Look here, как обеспечить свои собственные реализации

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

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

Пример

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

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

Check here для более подробной информации

+0

это не работает (возможно, так как я использую другой шаблон). Данные отображаются правильно, но формат - это просто цифры. Кроме того, обратите внимание, что тип данных в SQL Server Db является «реальным». Я добавил «Контроллер» и «Просмотр» в сообщении - в случае, если это помогает. – nam