2012-03-28 61 views
9

...之前,我只是出於好奇才這樣做。這裏沒有真實世界的應用程序,但只是爲了知識和修補... ...是一個ASP.net MVC查看「類」?

ASP.NET視圖具有像ModelViewData甚至有方法以及屬性。

您甚至可以使用@Using,就像常規的class.cs文件一樣。

我知道它是類型的WebPageView<TModel>

我的主要問題是:是它的一類?

這應該是因爲它是一個類型, ..

我應該能還這樣做,那麼(剃刀引擎):

@{ 
    public class Person 
    { 
     //etc... 
    } 

    var p = new Person(); 
} 

<span>@p.Name</span> 

但是我不能。爲什麼?

注:目前是C#,ASP.net初學者。

+1

它是[現在開源](http://weblogs.asp.net/scottgu/archive/2012/03/27/asp-net-mvc-web-api-razor-and-open-source.aspx )所以你現在可以[直接找到](http://aspnetwebstack.codeplex.com/)! – 2012-03-28 22:26:21

+1

技術答案是,視圖代碼被放入方法體。你不能在那裏上課。但是你爲什麼要在視圖中定義類?聽起來很可疑。 – CodesInChaos 2012-03-28 22:26:26

+0

@dtryon真棒!謝謝你的好消息:) – 2012-03-28 22:28:40

回答

5

你不能這樣做,因爲剃刀的標記是從WebViewPage或WebViewPage <的TModel導出生成的類中編入的語句序列的方法內>

更重要的問題,雖然,這就是爲什麼你想這樣做嗎?相反,寧願讓Razor免於這種邏輯 - 它的工作應該是生成佈局,而不是執行任何類型的業務邏輯或業務數據轉換。在你的動作方法中完成所有繁重的工作,並提供一個模型來描述以只需要簡單的Razor標記進行處理的格式來呈現佈局所需的數據。

有很多教程圍繞如何處理MVC和Razor進行。我挖掘出了這個簡短但合理的工作,涵蓋了可能有助於您理解的端到端故事。它確實包括使用EF來獲取數據以及可能更多的是你討價還價 - 但值得一讀,以獲得整個架構如何掛在一起的全貌:http://weblogs.asp.net/shijuvarghese/archive/2011/01/06/developing-web-apps-using-asp-net-mvc-3-razor-and-ef-code-first-part-1.aspx

5

是的,視圖是類。它們被編譯成臨時程序集(因此它們無法訪問主程序集的內部成員,這在處理動態/匿名類型時很有用)。

我認爲剃刀有一個規則,不允許聲明內部類,沒有檢查。

11

當然,你需要使用functions關鍵字以下降到露出類級別之類的字段,屬性,方法和內部類:

@functions { 
    public class Person 
    { 
     public string Name { get; set; } 
    } 
} 

@{ 
    var p = new Person(); 
} 

<span>@p.Name</span> 

這會工作得很好。

這就是說,請記住,這些內部類的唯一目的是,如果您需要定義僅用於視圖內的類型。我自己,我從來沒有發現需要這樣做的課程。但是,我利用這種技術來添加新的方法,這些方法在語法上與helper方法無關。

+0

哇!從來沒有見過'功能'關鍵字。它編譯!謝謝:) – 2012-03-28 22:50:41

+4

@JanCarloViray請考慮切換到這個選定的答案。 – CodeAngry 2014-10-06 03:12:14

+1

@JanCarloViray請注意CodeAngry的建議。 – 2015-12-14 12:14:15