1

我的视图模型中有一个 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 => m.Currents,"CurrentsTemplate") 来使用它,它会工作,但表单数据在其发布后不会持续存在。我猜我需要 for 循环中的隐藏字段以及 TextBox。

4

2 回答 2

1

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

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

这段代码

@model double

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

希望这可以帮助。

于 2013-03-06T08:54:22.133 回答
0

解决方案是在帮助程序中使用实际的成员名称以及所需的数据格式字符串@Html.TextBoxFor。由于数据是 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}")
}
  • 不会在 POST 回退中持续存在,因为它会生成名称为“x”的 HTML。
  • 这个虽然应用了正确的数据格式。

案例2:

@Html.EditorFor(m => m.Currents)
  • 不按需要格式化数据
  • 但由于在生成的 HTML 中使用了实际的视图数据成员名称,因此在 POST 后仍然存在。

案例3:

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

与案例 1 相同。

于 2013-03-07T03:54:39.810 回答