【问题标题】:Can't call Html.HiddenFor from within my HtmlHelper. Why?无法从我的 HtmlHelper 中调用 Html.HiddenFor。为什么?
【发布时间】:2012-05-10 11:59:33
【问题描述】:

我有一个像这样的 HtmlHelper:(为清楚起见进行了简化)

public static MvcHtmlString MyHelper<TModel>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, object>> expressionId)
{
    // do something here

    tagBuilder.Append(htmlHelper.HiddenFor(expressionId));

    // do something here
}

expressionId 返回string 时,代码工作正常。但是当它返回int时,Html.HiddenFor会触发这个错误:

模板只能用于字段访问、属性访问、一维数组索引或单参数自定义索引器表达式。

我不知道到底是什么问题,但我怀疑它与此有关: 当我在调试模式下检查expressionId 时,我可以看到表达式是:m =&gt; Convert(m.Id) 而不是预期的m =&gt; m.Id

让我烦恼的是,MyHelper 接收的参数类型与HiddenFor 完全相同。那么为什么我不能重新传递那个论点呢?

我该怎么办?

附言

我没有将任何可为空的表达式传递给 MyHelper(我已经看到其他一些问题的答案)

【问题讨论】:

    标签: .net asp.net-mvc-3 html-helper


    【解决方案1】:

    问题在于不可为空类型的强制转换表达式。

    尝试使用强类型帮助器而不是 object

    public static MvcHtmlString MyHelper<TModel, TProperty>(
        this HtmlHelper<TModel> htmlHelper, 
        Expression<Func<TModel, TProperty>> expressionId
    )
    {
        // do something here
    
        tagBuilder.Append(htmlHelper.HiddenFor(expressionId));
    
        // do something here
    }
    

    【讨论】:

    • 但这正是我所做的!
    • 哦,不,您的论点看起来像这样Expression&lt;Func&lt;TModel, object&gt;&gt;,这不是我在回答中所说的。在我的回答中,我向您的助手添加了第二个通用参数。仔细看看。
    猜你喜欢
    • 1970-01-01
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-22
    相关资源
    最近更新 更多