在MVC视图中调用并临时存储和对象

时间:2011-03-30 15:40:02

标签: asp.net-mvc-3 razor

我仍然在学习ASP.NET MVC3 Razor引擎,我正试图完成如何完成看似非常简单的事情。

我有一个静态类,它封装了一个调用第三方API的方法。我的_Layout.cshtml 母版页调用静态类,例如

if(@Rf.Models.PageContent.GetSomething().IsSomethingHappening) {
   <span>@Rf.Models.PageContent.GetSomething().Name</span>
}

正如您所看到的,我正在从我的静态类PageContent,方法GetSomething(它返回一个类)重复工作(以及调用第三方API)。

在常规的旧MVC2中,我会做这样的事情:

<% var obj = Rf.Models.PageContent.GetSomething();
   if(obj.IsSomethingHappening) { %>
   <span><%=obj.Name%></span>
<% } %>

......这不会重复努力。

我想调用PageContent.GetSomething()一次,存储它,如果我的标志为真,则引用它。如果我的旗帜是真的,我不想再次调用PageContent.GetSomething()。

这可能是一个非常简单的问题,但我对如何完成它有点困惑。如何从Razor引擎中复制相同类型的功能?

2 个答案:

答案 0 :(得分:5)

Razor中的等价物是:

@{
    var obj = Rf.Models.PageContent.GetSomething();
}

@if (obj.IsSomethingHappening)
{
    <span>@obj.Name</span>
}

显然,拥有从静态方法中提取数据的视图是最丑陋的反MVC实践之一。视图不应该提取任何数据。他们应该只使用控制器提供给他们的数据。

所以这是正确的方法:

public class FooController: Controller
{
    public ActionResult Index()
    {
        var obj = Rf.Models.PageContent.GetSomething();
        return PartialView(obj);
    }
}

并在相应的视图中(~/Views/Foo/Index.cshtml):

@model AppName.Models.SomeViewModel
@if (Model.IsSomethingHappening)
{
    <span>@Model.Name</span>
}

并简单地从您的_Layout拨打电话:

@Html.Action("Index", "Foo")

答案 1 :(得分:2)

使用@ {}语法

@{
    var obj = Rf.Models.PageContent.GetSomething();    
 }

 @if (obj.IsSomethingHappening)
 {
     <span><@obj.Name></span>
 }