【发布时间】:2018-10-15 14:00:48
【问题描述】:
我有一个属性需要在编辑器上显示
[Display(Name = "Created on")]
[UIHint("DateDisabled")]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd-MM-yyyy}")]
public DateTime? CreationDate { get; set; }
模板编辑器如下所示
@model DateTime?
@{
var culture = ...// retrieve culture;
}
@Html.TextBoxFor(m => m, "{0:"+ culture.DateTimeFormat.ShortDatePattern+"}",
new { @class = "form-control", style = "width:100%", disabled = "disabled" })
在一个视图中我正在使用这样的东西
@Html.HiddenFor(m => m.CreationDate)
@Html.EditorFor(m => m.CreationDate)
表单包含其他字段。打开编辑器时,CreationDate 看起来不错
<input name="CreationDate" id="CreationDate" type="hidden" value="10/12/2018 11:14:10 AM">
<input name="CreationDate" disabled="disabled" class="form-control" id="CreationDate" style="width: 100%;" type="text" value="10/12/2018">
但是如果表单包含一些错误的值并且服务器回发
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Update(Model viewModel)
{
if (!ModelState.IsValid)
{
return View("Edit", Model);
}
...
}
创建日期忽略格式,生成的html是这样的
<input name="CreationDate" id="CreationDate" type="hidden" value="10/12/2018 11:14:10 AM">
<input name="CreationDate" disabled="disabled" class="form-control" id="CreationDate" style="width: 100%;" type="text" value="10/12/2018 11:14:10 AM">
如您所见,格式被忽略并显示完整的日期和时间。
这个功能是设计的吗?发布错误后如何影响日期显示?
【问题讨论】:
-
为什么同一属性有一个隐藏的输入和一个禁用的文本框?原因是
HtmlHelper方法使用来自ModelState的值,而不是模型属性(如果它们存在),并且在您的 POST 方法中添加了一个ModelState值(来自隐藏的输入) -
我需要隐藏,因为输入被禁用,否则我会失去价值。所以你是说功能即设计?
-
请参阅TextBoxFor displaying initial value, not the value updated from code 以解释该行为。为什么不只使用只读文本框而不是禁用文本框加上隐藏输入(由于重复的
id属性,它也会生成无效的 html)? -
那你为什么不使用
[DisplayFormat]和ApplyFormatInEditMode呢? -
你可以使用
@Html.TextBoxFor(m => m, "{0:d"}", new { .. })
标签: c# razor asp.net-core-mvc