【问题标题】:DateTime Expression Returning Empty返回空的日期时间表达式
【发布时间】:2014-06-13 03:11:01
【问题描述】:

我有一个自定义 MVC 扩展,它接受 Expression<Func<TModel, object>> 的表达式。我正在尝试传入以下基于列表的表达式:

i => i.List[i].CreatedDate

表达式是正确的,当表达式是不同助手的字符串时,它可以正常工作。但是当我使用它并且值是日期时,当我使用它时它不会返回任何内容:

Html.IdFor(expression);

即使我使用

ExpressionHelper.GetExpressionText(expression);

它返回空。该表达式不为空,并表明它正确映射到该字段。为什么以及如何让表达式与日期一起使用?

编辑:在帮助程序中运行的底层代码是(注意:选项只包含具有 get/set 属性的值;它确实包含一个有效值作为表达式)。

var id = Html.IdFor(options.Expression).ToHtmlString();
var name = Html.NameFor(options.Expression).ToHtmlString();

var tag = new TagBuilder("input");
tag.Attributes.Add("id", id);
tag.Attributes.Add("name", name);

if (options.HtmlAttributes != null)
{
    foreach (var htmlAttribute in options.HtmlAttributes)
    {
        if (htmlAttribute.Value != null)
            tag.Attributes.Add(htmlAttribute.Key, htmlAttribute.Value.ToString());
    }
}

return new MvcHtmlString(tag.ToString());

【问题讨论】:

  • 能把扩展的代码放上来
  • 好的,但是扩展非常简单,所以我真的不明白这会有什么帮助。

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


【解决方案1】:

问题在于表达式的这个定义:

Expression<Func<TModel, object>>

你不能使用对象类型;基础类型必须与定义的属性完全匹配。一旦我进行了更正,它就起作用了。我认为可空到不可空属性(即 Expr 到 DateTime 属性)是可以的,但不反对 DateTime。

【讨论】:

  • 当您在Expression&lt;Func&lt;TModel, object&gt;&gt; 中返回一个object 并且实际值为structenum 类型时,表达式树将包含一个装箱转换树中最外层的表达式。我不知道 MVC,但也许 IdFor method 不正确地处理带有装箱转换的表达式树。将值类型包装到 Nullable&lt;&gt; 类型与将值类型装箱到 object 或接口类型是不同的转换。
猜你喜欢
  • 1970-01-01
  • 2016-11-24
  • 1970-01-01
  • 1970-01-01
  • 2019-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多