如何在MVC Razor中的数组或IEnumerable对象上应用DataFormatString
本文关键字:IEnumerable 对象 DataFormatString 应用 数组 MVC Razor | 更新日期: 2023-09-27 18:02:21
我的视图模型中有一个double数组,我想应用如下所示的数据格式字符串:
class MyVM
{
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:F2}")]
public double Currents[] { get; set; }
}
在我看来,我使用EditorFor上的数组如下所示,这是正常工作,除了它不应用数据格式字符串。
@Html.EditorFor(model => model.Currents)
我知道我可以使用自定义模板,但想知道是否有比创建自定义模板更简单的方法。如果自定义模板是唯一的解决方案,那么最简单的自定义模板应该是什么?我尝试创建一个,但没有成功地应用数据格式字符串正确。
我可以创建CurrentsTemplate。cshtml在~Views'与以下内容共享的文件夹
@model double[]
@foreach (double x in Model) {
<div class="editor-field">
@Html.TextBoxFor(m=>x, "{0:F2}")
</div>
}
并通过调用@Html来使用它。EditorFor(m => m. currents,"CurrentsTemplate"),它将工作,但表单数据在post后不持久。我想我需要隐藏字段在for循环随着TextBox。
创建一个自定义模板,根据需要格式化您的double。这样,当MVC看到double
时,它将使用你的模板,而不是它的内部逻辑来显示它。
例如,在Views'Shared文件夹中创建一个EditorTemplates
文件夹,然后创建double类型的强偏视图,命名为double.cshtml。
这段代码
@model double
@Html.TextBoxFor(m => m, "{0:F2}")
解决方案是在@Html.TextBoxFor
helper中使用实际的成员名以及所需的数据格式字符串。由于数据是IEnumerable,所以只需将其放入for循环中。生成的HTML将包含与视图模型的成员名匹配的适当名称字段,这对于跨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}")
}
- 在生成HTML时不会跨POST返回持久存在name = " x "。
- 这个应用了正确的数据格式。
案例2:
@Html.EditorFor(m => m.Currents)
- 未按需要格式化数据
- 但是在POST返回中持续存在,因为实际的视图数据成员名是在生成的HTML中使用的。
案例3:
@Html.EditorFor(m => m.Currents, "TemplateName")