我的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。
答案 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}")
}
案例2:
@Html.EditorFor(m => m.Currents)
案例3:
@Html.EditorFor(m => m.Currents, "TemplateName")
与案例1相同。