【问题标题】:Format textbox after post ignores format帖子忽略格式后格式化文本框
【发布时间】: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 =&gt; m, "{0:d"}", new { .. })

标签: c# razor asp.net-core-mvc


【解决方案1】:

对于您的问题,我建议您尝试以下选项:

  1. 改变模型如:

    [Display(Name = "Created on")]
    [UIHint("DateDisabled")]
    [DataType(DataType.Date)]
    //[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = @"{0:dd\/MM\/yyyy}")]
    public DateTime? CreationDate { get; set; }
    
  2. 像这样改变视图:

    @Html.TextBoxFor(model => model.CreationDate, @"{0:yyyy\/MM\/dd}", new { @class = "datepicker" })
    

【讨论】:

  • 它没有用。发帖后时间又出现了。
  • @Dan,有没有可重现的项目?
  • 很遗憾没有,因为我的项目很大
  • @Dan 与我们分享如何使用MVCModels/Edit/5 重现您的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-20
  • 2014-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多