是否应该尊重DisplayFormat?

时间:2012-04-03 01:37:37

标签: c# asp.net-mvc razor

在ASP.NET MVC 4 Beta中,我有一个具有此属性的实体:

[DisplayFormat(DataFormatString = "{0:o}", ApplyFormatInEditMode = true)]
public virtual DateTime SavedAt { get; set; }

在视图中,使用“具有读/写操作和视图的控制器,使用EntityFramework”模板生成,我有这个代码为它创建一个编辑器:

<div class="editor-label">
    @Html.LabelFor(model => model.SavedAt)
</div>
<div class="editor-field">
    @Html.EditorFor(model => model.SavedAt)
    @Html.ValidationMessageFor(model => model.SavedAt)
</div>

产生此输出:

<div class="editor-label">
    <label for="SavedAt">SavedAt</label>
</div>
<div class="editor-field">
    <input class="text-box single-line" data-val="true" data-val-date="The field SavedAt must be a date." data-val-required="The SavedAt field is required." id="SavedAt" name="SavedAt" type="text" value="2012-03-31T22:45:18.2244059" />
    <span class="field-validation-valid" data-valmsg-for="SavedAt" data-valmsg-replace="true"></span>
</div>

请注意,日期格式为“2012-03-31T22:45:18.2244059”。

如果我用以下代码替换视图代码片段:

@Html.HiddenFor(model => model.SavedAt)

生成此代码:

<input data-val="true" data-val-date="The field SavedAt must be a date." data-val-required="The SavedAt field is required." id="SavedAt" name="SavedAt" type="hidden" value="31/03/2012 22:45:18" />

请注意,日期现在格式为“31/03/2012 22:45:18”。

问题是:

是否希望HiddenFor遵守DisplayFormat属性定义的格式?

如果没有,那么以所需格式隐藏字段输出会有什么好处呢?

2 个答案:

答案 0 :(得分:6)

  

是否希望HiddenFor遵守DisplayFormat属性定义的格式?

不,它没有。只有EditorFor和DisplayFor助手使用DisplayFormat。

  

如果没有,那么拥有隐藏字段的好方法是什么   以所需格式输出?

你不应该真正关心隐藏字段的格式。它是隐藏的,没有人看到它。但如果由于某种原因您想要自定义格式,您可以使用自定义编辑器模板(~/Views/Shared/EditorTemplates/HiddenInput.cshtml)覆盖默认模板:

@if (!ViewData.ModelMetadata.HideSurroundingHtml)
{
    @Html.Encode(ViewData.TemplateInfo.FormattedModelValue)
}
@Html.Hidden("", ViewData.TemplateInfo.FormattedModelValue)

然后使用[HiddenInput]属性装饰您的视图模型属性,以指示您希望将其渲染为隐藏字段:

[DisplayFormat(DataFormatString = "{0:o}", ApplyFormatInEditMode = true)]
[HiddenInput(DisplayValue = false)]
public virtual DateTime SavedAt { get; set; }

最后:

@Html.EditorFor(x => x.SavedAt)

答案 1 :(得分:1)

我使用@Html.HiddenFor(model => model.SavedAt)发现了问题,这会阻止您进行回发。

为避免丢失日期值,我使用的是TempData,然后我在[HttpPost]

重新分配了模型值