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

时间:2013-03-06 03:15:54

标签: c# asp.net-mvc razor viewmodel dataformat

我的View模型中有一个double数组,我想应用如下所示的数据格式字符串:

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

在我的视图中,我在数组上使用EditorFor,如下所示,除了不应用数据格式字符串外,它正常工作。

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

我了解到我可以使用自定义模板,但我们想知道有一种比创建自定义模板更简单的方法。如果自定义模板是唯一的解决方案,那么应该处理格式化的最简单的自定义模板是什么?我尝试创建一个但没有成功应用数据格式字符串。

我可以使用以下内容在~Views \ Shared文件夹中创建CurrentsTemplate.cshtml

@model double[]

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

并通过调用@ Html.EditorFor(m =&gt; m.Currents,&#34; CurrentsTemplate&#34;)来使用它,它将起作用,但表单数据在POST后不会持久化。猜猜我需要for循环中的隐藏字段以及TextBox。

2 个答案:

答案 0 :(得分:1)

创建一个自定义模板,根据需要格式化您的double。这样,当MVC看到double时,它将使用您的模板而不是内部逻辑来显示它。

例如,在Views \ Shared文件夹中创建一个EditorTemplates文件夹,然后创建名为double.cshtml的double类型的强部分视图。

这段代码

@model double

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

希望这有帮助。

答案 1 :(得分: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}")
}
  • 在生成HTML时,不会在POST后面保留 NAME = “X”。
  • 这个应用了正确的数据格式。

案例2:

@Html.EditorFor(m => m.Currents)
  • 不按要求格式化数据
  • 但是,由于在生成的HTML中使用了实际的视图数据成员名称,所以在POST后面会持续存在。

案例3:

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

与案例1相同。