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

C# 如何在MVC Razor中对数组或IEnumerable对象应用DataFormatString?,c#,asp.net-mvc,razor,viewmodel,dataformat,C#,Asp.net Mvc,Razor,Viewmodel,Dataformat,我的视图模型中有一个double数组,我想应用如下所示的数据格式字符串: class MyVM { [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:F2}")] public double Currents[] { get; set; } } 在我看来,我正在如下所示的数组上使用EditorFor,它正常工作,只是没有应用数据格式字符串 @Html.EditorFor(model =>

我的视图模型中有一个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>
}
@model double[]
@foreach(模型中的双x){
@TextBoxFor(m=>x,“{0:F2}”)
}

通过调用@Html.EditorFor(m=>m.Currents,“CurrentsTemplate”)可以使用它,但表单数据在发布后不会持久化。我想我需要在for循环和文本框中隐藏字段。

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

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

这段代码

@model double

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

希望这能有所帮助。

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

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

这段代码

@model double

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

希望这有帮助。

解决方案是在
@Html.TextBoxFor
帮助程序中使用实际的成员名称和所需的数据格式字符串。由于数据是IEnumerable,只需将其放入for循环中即可。生成的HTML将包含与视图模型的成员名称相匹配的适当名称字段,这对于跨回发的数据持久性非常重要。不需要隐藏的HTML表单字段

@for (int k = 0; k < Model.Currents.Count(); k++ ) {
    @Html.TextBoxFor(model => model.Currents[k], "{0:F2}")                                                           
}
  • 不会在回发中持久化,因为它使用 name=“x”
  • 这一个应用了正确的数据格式
案例2:

@Html.EditorFor(m => m.Currents)
  • 不按需要设置数据格式
  • 但由于生成的HTML中使用了实际的视图数据成员名称,因此在回发过程中仍然存在
案例3:

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

与案例1相同。

解决方案是
@Html.TextBoxFor
帮助程序中使用实际的成员名称和所需的数据格式字符串。由于数据是IEnumerable,只需将其放入for循环中即可。生成的HTML将包含与视图模型的成员名称相匹配的适当名称字段,这对于跨回发的数据持久性非常重要。不需要隐藏的HTML表单字段

@for (int k = 0; k < Model.Currents.Count(); k++ ) {
    @Html.TextBoxFor(model => model.Currents[k], "{0:F2}")                                                           
}
  • 不会在回发中持久化,因为它使用 name=“x”
  • 这一个应用了正确的数据格式
案例2:

@Html.EditorFor(m => m.Currents)
  • 不按需要设置数据格式
  • 但由于生成的HTML中使用了实际的视图数据成员名称,因此在回发过程中仍然存在
案例3:

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

与案例1相同。

尝试不使用阵列,即使用电流而不是电流[]抱歉,这不是一个选项…需要阵列,因为它的很多数字都与@Husein Roncevic answerTry一起使用,即使用电流而不是电流[]很抱歉,这不是一个选项…需要一个数组,因为它的许多数字与@Husein Roncevic answer一起使用。如果double.cshtml位于~Views\Shared文件夹中,您的解决方案将更改整个项目中所有double的数据格式。但是,我可以创建~Views\MyController\Shared文件夹并将double.cshtml保留在该文件夹中,然后它将仅应用于MyController,但所有double都将格式化为2F。我的意思是~Views\MyController\EditorTemplates folderTrue。我不确定您需要哪个选项,因此我将代码放在共享文件夹中。如果double.cshtml位于~Views\Shared文件夹中,您将更改整个项目中所有double的数据格式。但是,我可以创建~Views\MyController\Shared文件夹并将double.cshtml保留在该文件夹中,然后它将仅应用于MyController,但所有double都将格式化为2F。我的意思是~Views\MyController\EditorTemplates folderTrue。我不确定您需要哪个选项,所以我将代码放在共享文件夹中。