2011-03-30 38 views
0

我仍然在学习ASP.NET MVC3 Razor引擎的过程中,我试图围绕如何完成一些东西,看起来如此令人难以置信的简单调用并暂时存储和MVC视图内的对象

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

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

正如你可以看到我重复劳动(和第三方API的调用)从我的静态类PageContent,方法GetSomething - 它返回一个类。

在普通的旧MVC2,我会做这样的事情:

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

...不重复劳动。

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

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

回答

5

在剃刀的等效是:

@{ 
    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") 
+0

太棒了,您的建议是金色的。谢谢! – 2011-03-30 16:21:52

2

使用@ {}语法

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

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