@Html.DisplayNameFor() 尊重 [Display] 属性,但 @Html.DisplayFor() 忽略 [DisplayFormat] 属性
@Html.DisplayNameFor() respects [Display] attribute but @Html.DisplayFor() ignores [DisplayFormat] attribute
我有这个视图模型:
public class ConceptViewModel
{
public int Id { get; set; }
[Required(ErrorMessageResourceName = "Message_Required", ErrorMessageResourceType = typeof(Resources.Web.ValidationsViewModels))]
[Display(Name = "ConceptViewModel_Name", ResourceType = typeof(Resources.Web.Contracts))]
public string Concept { get; set; }
[Required(ErrorMessageResourceName = "Message_Required", ErrorMessageResourceType = typeof(Resources.Web.ValidationsViewModels))]
[Display(Name = "ConceptViewModel_TotalUnits", ResourceType = typeof(Resources.Web.Contracts))]
[DisplayFormat(DataFormatString = "{0:###,###}")] // Ignored by @Html.DisplayFor()
public decimal TotalUnits { get; set; }
}
该视图模型位于另一个视图模型的 collection 属性 中,而该视图模型恰好是传递给视图的视图模型:
public class ContratConceptsViewModel : BaseClass
{
public int ContratId { get; set; }
// This collection
public List<ConceptViewModel> Concepts { get; set; }
public ContratConceptsViewModel()
{
Concepts = new List<ConceptViewModel>();
}
}
然后,在视图中,我有这段代码:
@model ContratConceptsViewModel
@foreach (var concept in Model.Concepts)
{
<thead>
<tr>
<td> @Html.DisplayNameFor(model => concept.Concept) </td> @* Works as expected *@
<td> @Html.DisplayNameFor(model => concept.TotalUnits) </td> @* Works as expected *@
</tr>
</thead>
<tbody>
<tr>
<td> @Html.DisplayFor(model => concept.Concept) </td>
<td> @Html.DisplayFor(model => concept.TotalUnits) </td> @* Doesn't show the correct format *@
</tr>
</tbody>
}
当我执行这段代码时,[Display]
属性被考虑在内,但 [DisplayFormat]
属性被完全忽略。我做错了什么?
注意:我搜索过这样的问题,尽管有很多其他标题相似的问题,但它们与这个不同。
您应该修改 DisplayFor
和 DisplayNameFor
中的表达式。
它必须是 @Html.DisplayFor(model => model.TotalUnits)
,而不是 @Html.DisplayFor(model => concept.TotalUnits)
。
更新
因为您要显示列表中的项目 @Html.DisplayFor
将无法正常工作:它应该与单一模型一起工作。我建议将每个项目的模板提取到单独的文件中(在 MVC 中称为显示模板):
您的显示模板(必须放在DisplayTemplates文件夹中):
@model ConceptViewModel
<thead>
<tr>
<td> @Html.DisplayNameFor(model => model.Concept) </td>
<td> @Html.DisplayNameFor(model => model.TotalUnits) </td>
</tr>
</thead>
<tbody>
<tr>
<td> @Html.DisplayFor(model => model.Concept) </td>
<td> @Html.DisplayFor(model => model.TotalUnits) </td>
</tr>
</tbody>
您的主页:
@model ContratConceptsViewModel
@foreach (var concept in Model.Concepts)
{
@Html.DisplayFor(model => concept, "name of your display template, optional if you follow conventions")
}
这里是关于显示模板的link。
好吧,都是我的错。我的一位同事在文件夹 Views\Shared\DisplayTemplates\Decimal.cshtml 中为 decimal
创建了一个模板。这就是 @Html.DisplayFor()
忽略该属性的原因,因为它尊重我同事创建的模板。
我有这个视图模型:
public class ConceptViewModel
{
public int Id { get; set; }
[Required(ErrorMessageResourceName = "Message_Required", ErrorMessageResourceType = typeof(Resources.Web.ValidationsViewModels))]
[Display(Name = "ConceptViewModel_Name", ResourceType = typeof(Resources.Web.Contracts))]
public string Concept { get; set; }
[Required(ErrorMessageResourceName = "Message_Required", ErrorMessageResourceType = typeof(Resources.Web.ValidationsViewModels))]
[Display(Name = "ConceptViewModel_TotalUnits", ResourceType = typeof(Resources.Web.Contracts))]
[DisplayFormat(DataFormatString = "{0:###,###}")] // Ignored by @Html.DisplayFor()
public decimal TotalUnits { get; set; }
}
该视图模型位于另一个视图模型的 collection 属性 中,而该视图模型恰好是传递给视图的视图模型:
public class ContratConceptsViewModel : BaseClass
{
public int ContratId { get; set; }
// This collection
public List<ConceptViewModel> Concepts { get; set; }
public ContratConceptsViewModel()
{
Concepts = new List<ConceptViewModel>();
}
}
然后,在视图中,我有这段代码:
@model ContratConceptsViewModel
@foreach (var concept in Model.Concepts)
{
<thead>
<tr>
<td> @Html.DisplayNameFor(model => concept.Concept) </td> @* Works as expected *@
<td> @Html.DisplayNameFor(model => concept.TotalUnits) </td> @* Works as expected *@
</tr>
</thead>
<tbody>
<tr>
<td> @Html.DisplayFor(model => concept.Concept) </td>
<td> @Html.DisplayFor(model => concept.TotalUnits) </td> @* Doesn't show the correct format *@
</tr>
</tbody>
}
当我执行这段代码时,[Display]
属性被考虑在内,但 [DisplayFormat]
属性被完全忽略。我做错了什么?
注意:我搜索过这样的问题,尽管有很多其他标题相似的问题,但它们与这个不同。
您应该修改 DisplayFor
和 DisplayNameFor
中的表达式。
它必须是 @Html.DisplayFor(model => model.TotalUnits)
,而不是 @Html.DisplayFor(model => concept.TotalUnits)
。
更新
因为您要显示列表中的项目 @Html.DisplayFor
将无法正常工作:它应该与单一模型一起工作。我建议将每个项目的模板提取到单独的文件中(在 MVC 中称为显示模板):
您的显示模板(必须放在DisplayTemplates文件夹中):
@model ConceptViewModel
<thead>
<tr>
<td> @Html.DisplayNameFor(model => model.Concept) </td>
<td> @Html.DisplayNameFor(model => model.TotalUnits) </td>
</tr>
</thead>
<tbody>
<tr>
<td> @Html.DisplayFor(model => model.Concept) </td>
<td> @Html.DisplayFor(model => model.TotalUnits) </td>
</tr>
</tbody>
您的主页:
@model ContratConceptsViewModel
@foreach (var concept in Model.Concepts)
{
@Html.DisplayFor(model => concept, "name of your display template, optional if you follow conventions")
}
这里是关于显示模板的link。
好吧,都是我的错。我的一位同事在文件夹 Views\Shared\DisplayTemplates\Decimal.cshtml 中为 decimal
创建了一个模板。这就是 @Html.DisplayFor()
忽略该属性的原因,因为它尊重我同事创建的模板。