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