2013-03-06 6 views
2

У меня есть массив двойной в моей модели представления, и я хотел бы применить строку формата данных, как показано ниже:Как применить DataFormatString для массива или объекта IEnumerable в MVC Razor?

class MyVM 
{ 
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:F2}")] 
    public double Currents[] { get; set; } 
} 

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

@Html.EditorFor(model => model.Currents) 

я узнал, что я могу использовать пользовательские шаблоны, но было интересно, есть более простой способ, чем создание пользовательского шаблона. Если пользовательский шаблон является единственным решением, каков самый простой пользовательский шаблон, который должен заботиться о форматировании? Я попытался создать один, но не смог правильно применить строку формата данных.

я могу создать CurrentsTemplate.cshtml в ~ Views \ Shared папку с содержимым, приведенным ниже

@model double[] 

@foreach (double x in Model) { 
<div class="editor-field"> 
    @Html.TextBoxFor(m=>x, "{0:F2}") 
</div> 
} 

и использовать его с помощью вызова @ Html.EditorFor (м => m.Currents, "CurrentsTemplate") , он будет работать, но данные формы не сохраняются после его POSTED. Думаю, мне нужны скрытые поля в цикле for вместе с TextBox.

+0

Try без массива, т.е. использование Потоков вместо Потоков [] –

+0

Извините это еще не вариант ... нужен массив с момента его много номеров – Raj

+0

go with @Husein Roncevic answer – Satpal

ответ

0

Решение использует фактическое имя участника вместе с нужной строкой данных в справочнике @Html.TextBoxFor. Поскольку данные являются IEnumerable, просто поместите его в цикл for. Сгенерированный HTML будет содержать соответствующее поле имени, совпадающее с именем участника View Model, которое важно для сохранения данных в образах POST. Не требуется скрытых полей формы HTML.

@for (int k = 0; k < Model.Currents.Count(); k++) { 
    @Html.TextBoxFor(model => model.Currents[k], "{0:F2}")               
} 

Вышеупомянутое будет работать с правильным форматированием данных. Он генерирует

<input name="Currents[0]" id="Currents_0_" type="text" data-val-number="The field Double must be a number." data-val="true" value="0.8"/> 

и работает с надлежащим сохранением через оповещения POST.

Следующие три случая не работает:

случая 1:

@foreach (double x in Model) { 
    @Html.TextBoxFor(m=>x, "{0:F2}") 
} 
  • не сохраняются спины POST, как он генерирует HTML с имени = "х".
  • В этом случае применяется правильное форматирование данных.

Случай 2:

@Html.EditorFor(m => m.Currents) 
  • ли не формат данных в случае необходимости
  • Но сохраняется через POST поддерживает, так как фактический вид имя элемента данных используется в генерируемой HTML.

случай 3:

@Html.EditorFor(m => m.Currents, "TemplateName") 

То же случае 1.

1

Создайте собственный шаблон, который будет форматировать ваш двойной при необходимости. Таким образом, когда MVC видит double, он будет использовать ваш шаблон, а не внутреннюю логику для его отображения.

Например, создайте папку EditorTemplates в папке Views \ Shared, затем создайте строго частичный вид типа double named double.cshtml.

Этого фрагмент кода

@model double 

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

Надеется, что это помогает.

+0

Вы измените формат данных для всех удвоений во всем проекте, если double.cshtml находится в папке ~ Views \ Shared. Однако я могу создать папку ~ Views \ MyController \ Shared и оставить файл double.cshtml в этой папке, тогда он будет применяться только к MyController, но все удваиваются будут отформатированы до 2F. – Raj

+0

Я имел в виду ~ Views \ MyController \ EditorTemplates папку – Raj

+0

Правда. Я не был уверен, какой вариант вам нужен, поэтому я поместил код в общую папку. –