在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属性定义的格式?
如果没有,那么以所需格式隐藏字段输出会有什么好处呢?
答案 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]