簡體   English   中英

從ASP.NET MVC Lambda Expression獲取價值

[英]Get value from ASP.NET MVC Lambda Expression

我正在嘗試創建自己的HTML Helper,它接受一個表達式(類似於內置的LabelFor <>幫助器。我已經找到了在表達式類似於此時獲取屬性值的示例:

model => model.Forename

但是,在我的一些模型中,我想獲取子元素中的屬性,例如

model => mode.Person.Forename

在這些例子中,無論如何我都找不到(輕松)獲取Forename的值。 任何人都可以建議我應該如何獲得這個價值。

謝謝

如果您使用的是LabelFor <>方法使用的相同模式,那么表達式將始終是LambdaExpression,您只需執行它即可獲取值。

var result = ((LambdaExpression)expression).Compile().DynamicInvoke(model);

通常,您始終可以在LambdaExpressions中包裝泛型表達式,然后編譯並調用它們以獲取值。

如果你想要的不是Forename的值,而是字段本身(fx。打印出字符串“Forename”)那么你唯一的選擇是使用某種形式的表達式。 在C#4中,框架提供了一個名為ExpressionVisitor的類,可以用於此,但是對於框架的早期版本,您必須自己實現它 - 請參閱: http//msdn.microsoft.com/en-us/library/ bb882521(VS.90)的.aspx

你在尋找價值?

為什么這不起作用?

    public object GetValue<T>( Expression<Func<T>> accessor )
    {
        var func = accessor.Compile();

        return func.Invoke();
    }

我已經單獨回答了這個問題,因為有兩件事我不喜歡接受的答案。

  1. 它沒有解釋如何在編寫自定義html幫助程序時獲取對模型的引用,該模型是關鍵信息
  2. 如果您事先知道lambda表達式的委托類型是什么,則將其強制轉換為Lambda表達式並使用DynamicInvoke是不必要的。 根據我編寫自定義助手的經驗,我傾向於先了解類型。

我之前知道的示例是為lambda表達式設計的,它產生一個字節數組:

public static MvcHtmlString MyHelper<TModel>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, byte[]>> expression)
    {

        var compiledExpression = expression.Compile();
        byte[] byteData = compiledExpression(htmlHelper.ViewData.Model);

        ...
        ...
        ...

        return new MvcHtmlString(.......);
    }

暫無
暫無

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

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