2013-03-06 32 views
2

我有双阵列在我的视图模型,我想申请一个数据格式字符串像图所示:如何在MVC Razor中的数组或IEnumerable对象上应用DataFormatString?

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

在我看来,我使用EditorFor阵列上如下图所示,这除了不应用数据格式字符串之外,它正常工作。

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

我知道我可以使用自定义模板,但想知道是否有比创建自定义模板更简单的方法。如果自定义模板是唯一的解决方案,那么最简单的自定义模板应该关注格式?我试图创建一个,但没有正确应用数据格式字符串。

我可以在〜视图创建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”) ,它会工作,但表单数据在POST后不会持久。猜猜我在for循环中需要隐藏字段以及TextBox。

+0

尝试没有阵列即使用电流而不是电流[] – 2013-03-06 03:34:29

+0

对不起那不是一个选项...需要因为它的地段数组的数字 – Raj 2013-03-06 03:38:25

+0

与@Husein Roncevic一起回答 – Satpal 2013-03-06 09:00:16

回答

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) 
  • 并不数据格式根据需要
  • 但是仍然存在跨越POST备份因为实际的视图数据成员名称在生成的HTML使用。

的情况下3:

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

同情况1.

1

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

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

这段代码

@model double 

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

希望这有助于。

+0

如果double.cshtml位于〜Views \ Shared文件夹中,则您的解决方案将更改整个项目中所有双打的数据格式。不过,我可以创建〜Views \ MyController \ Shared文件夹并将double.cshtml保留在该文件夹中,然后它将应用于仅MyController,但所有双打将被格式化为2F。 – Raj 2013-03-06 16:00:46

+0

我的意思是〜Views \ MyController \ EditorTemplates文件夹 – Raj 2013-03-06 16:11:26

+0

是的。我不确定你需要哪个选项,所以我把代码放到共享文件夹中。 – 2013-03-06 16:14:34

相关问题