我正在尝试为我的ASP.NET MVC5页面创建自定义编辑器,但是当下面示例中的属性TProp
为Nullable<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 })
答案 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