假设我有一个对象数组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建议的时候添加一个扩展,但我只需要在那个视图
上答案 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>