我是ASP.NET / C#中的MVC2的新手,所以如果我误解了某些内容,请原谅我。我的控制器中有类似的代码:
var singleInstance = new Person("John");
ViewData["myInstance"] = singleInstance;
return View();
所以在我看来,Index.aspx,我希望能够引用该对象中的成员。例如,Person有一个名为Name的成员,它在构造函数中设置。在视图中,我想从ViewData对象中存储的内容中获取Person.Name。例:
<%= ViewData["myInstance"].name %>
这不起作用。我发现的唯一真正的解决方法是做这样的事情:
<% var thePerson = ViewData["myInstance"];
print (or whatever the method is) thePerson.Name;
%>
任何帮助都会非常感激...这在PHP / Zend Framework中非常容易...... 叹息
答案 0 :(得分:0)
这应该可行,但在这种情况下更容易使用强类型视图(安全性方面的好处,以及使用模型数据更容易修改视图)。然后你可以在控制器中执行此操作:
var singleInstance = new Person("John");
return View(singleInstance);
并在您看来:
<%= html.encode(model.name) %>
在你的情况下,我在某些情况下使用ViewData对象,你应该使用它。现在,Visual Studio中的IntelliSense不会自动显示特定ViewData对象的属性,因为您可以在ViewData中传递“任何内容”。除非在C#中,否则你必须拥有它。
<%= ViewData["myInstance"].name; %>
也许C#ASP.MVC'er可以在这个上加权
'任何事情' - 以防万一有一些你无法传递的物品
编辑:评论印刷品或其他线
您不必调用任何方法来打印任何内容,只需将变量/对象包装在&lt;%=%&gt;中即可。标签。 html.Encode()方法有助于防止XSS攻击和其他恶意攻击。
答案 1 :(得分:0)
查看this教程。
你应该(正如Tommy提到的那样)使用返回视图(foo)将模型对象传递给View。但是如果您必须使用ViewData(有时您需要),只需将您的对象转换回View中的原始类型。
即
<%= (ViewData["myInstance"] as Person).name; %>
您需要进行强制转换,因为ViewData只是一个包含对象的字典。它不是强类型的,这就是为什么在大多数情况下首选使用ActionResult直接传递给View。
答案 2 :(得分:0)
为什么不创建一个接受“Person”的强类型视图?
在您的控制器中
var singleInstance = new Person("John");
ViewData.Model = singleInstance;
return View();
在您的(强类型)视图
中<%= Html.Encode (Model.name) %>