如何用剃刀

时间:2015-06-17 10:54:31

标签: c# asp.net-mvc razor

假设我有一个对象数组myObjects,其字符串属性为Alpha,Beta,Gamma,......

在我的视图中,我可以像Razor一样显示内容

<ul>
    @foreach(obj in myObjects){
        <li>@obj.Alpha</li>
        <li>@obj.Beta</li>
        <li>@obj.Gamma</li>
         ...
    }
<ul>

但是,如果我想压缩代码,传递一个带有名称的数组(例如通过ViewBag),并尝试类似

<ul>
    @foreach(obj in myObjects){
        @foreach(name in ViewBag.Names)    
            <li>@obj.@name</li>
        }
    }
<ul>

Razor不会将其插入为 object.property ,而只是输出

myObjects.Alpha
myObjects.Beta
myObjects.Gamma
....

我非常确定有一百万种方法可以获得相同的结果,但是因为类似的东西在PHP或JavaScript中非常容易,而且我是Razor的新手,我想要了解它的功能。 我已经尝试了很多东西,比如String.Concat,String.Format,以及@和括号的各种组合,但没有运气。

由于

解决方案:

@helper GetPropertyValue(object src, string propName)
     {
         @src.GetType().GetProperty(propName).GetValue(src, null);
     }

用作

@GetPropertyValue(obj,name)

我可以在Pawel建议的时候添加一个扩展,但我只需要在那个视图

3 个答案:

答案 0 :(得分:1)

我相信你最好的选择是使用普通的.NET反射,也许是通过项目中定义的自定义帮助扩展方法,以便于使用:

<li>@obj.GetType().GetProperty(name).GetValue(obj, null)</li>

答案 1 :(得分:0)

在您的案例中,您可以通过反思实现目标。您可以创建简单的扩展方法:

public static void HtmlHelperExtensions
{
     public static object GetPropertyValue(this HtmlHelper html, object src, string propName)
     {
         return src.GetType().GetProperty(propName).GetValue(src, null);
     }
}

然后在web.config文件中为名称空间节点添加适当的名称空间:

<add namespace="htmlhelperclassnamespace" />

以这种方式在代码中使用:

<li>@Html.GetPropertyValue(obj, name)</li>

答案 2 :(得分:0)

我看到你已经有了一个可行的解决方案。不过,我正在发布另一种方法,利用.net的dynamic功能。请注意,myObjects应该是ExpandoObject的列表。

<ul>
   @foreach (var obj in myObjects)
        {
            var item = (IDictionary<string, object>)obj;
            foreach (var name in ViewBag.Names)
            {   
                <li>@item[name]</li>
            }
        }
<ul>