如何引用传递给View的单个对象的成员?

时间:2010-06-17 00:26:13

标签: c# model-view-controller asp.net-mvc-2

我是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中非常容易...... 叹息

3 个答案:

答案 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) %>