簡體   English   中英

在自定義EditorFor中使用可空的DateTime

[英]Working with Nullable DateTime in Custom EditorFor

我正在嘗試為ASP.NET MVC5頁面創建自定義編輯器,但是當下面示例中的TProp屬性為Nullable<DateTime>我會收到錯誤消息。 失敗似乎發生在helper.EditorFor(Property) 這是錯誤:

傳遞到字典中的模型項為null,但是此字典需要類型為'System.DateTime'的非空模型項。

這是代碼:

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);
}

編輯:為視圖,viewmodel和編輯器模板添加代碼參考代碼

View :試圖呈現視圖模型值的代碼

@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; }

EditorTemplateDateTime編輯器模板

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

引發該錯誤是因為您為DateTime創建了一個自定義EditorTemplate ,該擴展helper.EditorFor(property)由擴展方法中的helper.EditorFor(property)調用。 這會將Nullable<DateTime>模型傳遞給期望使用DateTime模型(不可為空)的視圖。

您可以通過將模板中的聲明更改為

@model DateTime? // nullable

但是,使用兩種擴展方法EditorTemplate以為簡單的值類型調用EditorTemplate方法幾乎沒有任何意義,因此您應該使用其中一種方法。

使用擴展方法,您的代碼將是(請注意,此代碼使用推薦的TagBuilder類生成html)

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());   
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM