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
标签,看它是否具有包含有效 DateTime
的 value
属性。如果是,并且值等于 1/1/1900
,value
将被设置为空字符串。
使用编辑器模板的解决方案
您可以使用共享编辑器模板来解决此问题,该模板将用于呈现所有类型的 DateTime
。为此,您需要执行以下操作:
- 在您的 ~/Views/Shared 文件夹中创建一个新的
EditorTemplates
文件夹。名称很重要,因为它在 MVC 中具有特殊含义,所以请按照我显示的名称命名。
- 在此文件夹中创建一个新的
DateTime.cshtml
视图。同样,名称很重要,因为它将与您希望为其创建模板的类型相匹配(在本例中为 DateTime
实例)。
完成后,它应该如下所示:
打开 DateTime.cshtml
并将其更改为以下内容:
@model DateTime
@if (Model.Date == new DateTime(1900, 1, 1))
{
@Html.TextBox("", "")
}
else
{
@Html.TextBox("", Model)
}
如果传入的日期与您的默认日期匹配,它将呈现一个包含空字符串的文本框,否则它将正常呈现您的日期。
我正在研究 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
标签,看它是否具有包含有效 DateTime
的 value
属性。如果是,并且值等于 1/1/1900
,value
将被设置为空字符串。
使用编辑器模板的解决方案
您可以使用共享编辑器模板来解决此问题,该模板将用于呈现所有类型的 DateTime
。为此,您需要执行以下操作:
- 在您的 ~/Views/Shared 文件夹中创建一个新的
EditorTemplates
文件夹。名称很重要,因为它在 MVC 中具有特殊含义,所以请按照我显示的名称命名。 - 在此文件夹中创建一个新的
DateTime.cshtml
视图。同样,名称很重要,因为它将与您希望为其创建模板的类型相匹配(在本例中为DateTime
实例)。
完成后,它应该如下所示:
打开 DateTime.cshtml
并将其更改为以下内容:
@model DateTime
@if (Model.Date == new DateTime(1900, 1, 1))
{
@Html.TextBox("", "")
}
else
{
@Html.TextBox("", Model)
}
如果传入的日期与您的默认日期匹配,它将呈现一个包含空字符串的文本框,否则它将正常呈现您的日期。