2011-03-30 41 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> 
}