如何在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。

如何在MVC Razor中的数组或IEnumerable对象上应用DataFormatString

创建一个自定义模板,根据需要格式化您的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")

相关文章: