[英]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; }
EditorTemplate : DateTime
編輯器模板
@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.