在Custom EditorFor中使用Nullable DateTime

时间:2017-01-19 01:59:34

标签: c# asp.net asp.net-mvc datetime

我正在尝试为我的ASP.NET MVC5页面创建自定义编辑器,但是当下面示例中的属性TPropNullable<DateTime>时,我收到错误。失败似乎发生在helper.EditorFor(Property)上。这是错误:

  

传入字典的模型项为null,但是这个字典   需要一个类型为System.DateTime&#39;。

的非null模型项

以下是代码:

public static IHtmlString CustomEditorFor<TModel, TProp>(this HtmlHelper<TModel> helper,
    Expression<Func<TModel, TProp>> property)
{
    var htmlString =
        "<div class=\"form-group\">" +
            helper.LabelFor(property) +
            "<div class=\"col-md-10\">" +
                helper.EditorFor(property) +
                helper.ValidationMessageFor(property) +
            "</div>" +
        "</div>"
        ;
    return new HtmlString(htmlString);
}

编辑:为视图,视图模型和编辑器模板添加代码参考代码

查看:尝试呈现视图模型值的代码

@model MyApp.Web.ViewModels.ProductViewModel

<div class="panel panel-primary">
    <div class="panel-heading">Upgrade Details</div>
    <div class="panel-body">
        <div class="form-horizontal">
            @Html.CustomEditorFor(model => model.DateUpgraded)
        </div>
    </div>
</div>

Viewmodel :这是无法渲染的Nullable<DateTime>属性

public Nullable<DateTime> DateUpgraded { get; set; }

EditorTemplate DateTime

的编辑器模板
@model DateTime
@Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue,
        new { @class = "form-control", placeholder = ViewData.ModelMetadata.Watermark })

1 个答案:

答案 0 :(得分:1)

引发错误是因为您为EditorTemplate创建了一个自定义DateTime,您的helper.EditorFor(property)会在您的扩展程序中调用该自定义Nullable<DateTime>。这会将DateTime模型传递给一个视图,该视图需要一个@model DateTime? // nullable (不可为空)的模型。

您可以通过将模板中的声明更改为

来解决问题
EditorTemplate

然而,同时使用一个为TagBuilder调用简单值类型的扩展方法毫无意义,你应该使用其中一个。

使用扩展方法,您的代码将是(请注意,这使用推荐的public static IHtmlString CustomEditorFor<TModel, TProp>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProp>> property) { var name = ExpressionHelper.GetExpressionText(property); var metadata = ModelMetadata.FromLambdaExpression(property, helper.ViewData); var formatString = metadata.DisplayFormatString; var watermark = metadata.Watermark; StringBuilder html = new StringBuilder(); html.Append(helper.TextBoxFor(property, formatString, new { @class = "form-control", placeholder = watermark })); html.Append(helper.ValidationMessageFor(property)); TagBuilder container = new TagBuilder("div"); container.AddCssClass("col-md-10"); container.InnerHtml = html.ToString(); html = new StringBuilder(); html.Append(helper.LabelFor(property)); html.Append(container.ToString()); container = new TagBuilder("div"); container.AddCssClass("form-group"); container.InnerHtml = html.ToString(); return MvcHtmlString.Create(container.ToString()); } 类来生成html)

JAXBIntrospector