ASP.net MVC6 在某个日期时间以表单形式显示为空

ASP.net MVC6 show Empty in a form when for some datetime

我正在研究 asp.net MVC6。

我有模型

public class MeterValueViewModel: IAuditable
    {          
        public int Id { get; set; }
        public DateTime MyDate{ get; set; }
   }

我的表格里有这个

   <input asp-for="MyDate" class="form-control">

我的日期可以是 1/1/1900,这是我申请中的默认日期或任何其他有效日期(任何大于 1/1/1900 的日期在我的系统中都被视为有效)。

我想要做的是 全局 设置日期,以便我的表单显示 日期,当值 MyDate 是 1/1/1900。它应该对任何 ViewModel 中的另一个 DateTime 属性 执行相同的操作。所以这应该以任何形式发生。

是否有某种模型绑定或标签助手来全局处理此问题?

编辑 - 使用标签助手的解决方案

如果您想使用标签助手执行此操作,请创建以下标签助手:

[HtmlTargetElement("input", Attributes = "asp-for", TagStructure = TagStructure.WithoutEndTag)]
public class DefaultDateTimeTagHelper : TagHelper
{
    private const string ValueAttribute = "value";
    private DateTime DefaultDateTime = new DateTime(1900, 1, 1);

    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
        var value = output.Attributes[ValueAttribute].Value;
        if (value != null)
        {
            DateTime dt;
            if (DateTime.TryParse(value.ToString(), out dt)
                && dt.Date == DefaultDateTime)
            {
                output.Attributes.SetAttribute(ValueAttribute, "");
            }
        }
    }
}

接下来,在~/Views/_ViewImports.cshtml中注册助手。我只是在我的本地应用程序中注册所有标签助手,使用 * 语法:

@using WebApplication1
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@addTagHelper *, WebApplication1

仅此而已。将检查任何具有 asp-for 属性的 input 标签,看它是否具有包含有效 DateTimevalue 属性。如果是,并且值等于 1/1/1900value 将被设置为空字符串。

使用编辑器模板的解决方案

您可以使用共享编辑器模板来解决此问题,该模板将用于呈现所有类型的 DateTime。为此,您需要执行以下操作:

  1. 在您的 ~/Views/Shared 文件夹中创建一个新的 EditorTemplates 文件夹。名称很重要,因为它在 MVC 中具有特殊含义,所以请按照我显示的名称命名。
  2. 在此文件夹中创建一个新的 DateTime.cshtml 视图。同样,名称很重要,因为它将与您希望为其创建模板的类型相匹配(在本例中为 DateTime 实例)。

完成后,它应该如下所示:

打开 DateTime.cshtml 并将其更改为以下内容:

@model DateTime

@if (Model.Date == new DateTime(1900, 1, 1))
{
    @Html.TextBox("", "")
}
else
{
    @Html.TextBox("", Model)
}

如果传入的日期与您的默认日期匹配,它将呈现一个包含空字符串的文本框,否则它将正常呈现您的日期。