2010-10-12 58 views
1

我有一個正在處理的Web應用程序,我想避免視圖中if/elseif/else的混亂,並且爲了有條件地包含在視圖中而有太多獨立的ascx文件。有沒有辦法阻止呈現MVC視圖的純文本部分?

我想要做的是建立某種形式的簡單類的作品,像這樣(的實例證實想什麼,我來實現)

<% using(RequiresAccessTo.Feature(Features.FancyStuff)) { %> 
Special content for users 
<% } %> 

如果用戶確實不訪問該功能,該類將呈現註冊鏈接。我知道我可以簡單地使用if/else,但根據訪問級別,else塊的內容可以是2-3種不同的標準響應之一,並且該機制將用於網站周圍的無數地方。

如果有辦法簡單地阻止用戶的特殊內容完全呈現,這意味着我可以使網站上的模板非常易於維護。

+3

這是部分視圖(即.ascx)的用途。不知道你爲什麼不想使用它。您可以將參數傳遞到分部視圖,就像使用'RequiresAccessTo.Feature'示例一樣。你也可以考慮編寫一個擴展方法,但這需要在C#代碼中進行大量的HTML生成,這通常是不可取的。 – 2010-10-12 12:56:52

+1

實際上不是局部視圖嗎?說你想在「某種簡單的課堂上」這樣做是雙重行爲。這正是一種觀點。 – spender 2010-10-12 13:09:18

+0

@Kirk - 據我所知,在我的情況下,我最終會爲每個有問題的aspx文件提供10,20,30或更多的部分視圖。我正在尋找一種解決方案,它能夠:(a)停止正在討論的aspx文件被分割成大量的ascx文件,並且(b)停止代碼與if/elseif/else塊之間的spaghetti。 – 2010-10-12 13:54:00

回答

2

您可能嘗試的另一種選擇是創建自定義服務器控件。控件上的屬性可能包含您想要檢查權限的功能集。如果該權限未得到滿足,則該控件將呈現適合該訪問級別或權限的註冊鏈接。你的意見將最終看起來像:

<controls:SignUpWrapper runat="server" id="signup" access="FancyStuff"> 
    <div> 
     Approved user contents. 
    </div> 
</controls:SignUpWrapper> 

在你的控制,你會首先檢查的許可,則使無論是適當的鏈接或提供的HTML。這裏最棘手的一點可能是獲取路由信息到您的服務器控制代碼。不是我試過的東西。最糟糕的情況我想你應該能夠通過必要的信息,甚至通過屬性的整個註冊鏈接。沒有等待,更糟的是繞過路由,強制URL通過配置值,呃......是的。無論哪種方式,它都比你想要的例子更有意思,但並不遙遠。

我想有些人可能會看到,即使服務器控制思想有點過分。但只要遠離視圖狀態,回發行爲和其他一些經典的ASP.NET功能,就沒有什麼能夠阻止使用服務器控件。我們都已經使用了主人和內容容器。對不起,如果你已經在合唱團傳教。 =)

目前,這正在擴展我的想象力,甚至常識有點取決於生成該鏈接的難度。如果我想到其他東西,我會檢查一下。

+0

嗯,那可以工作。回到ASP.Net WebForms語法雖然讓我感到有點不高興。如果有辦法暫時抑制Response.Write輸出,可以解決整個問題。 – 2010-10-12 15:25:49

+0

我想問題是,邏輯需要去某個地方,在這一點上,我們只是談論很多方法來做到這一點。我曾研究過試圖爲MVC創建自己的'使用'友好實體/例程,類似於Html.BeginForm()機制。我認爲我發現在頁面上有一個特殊的考慮。雖然能寫我們自己會很高興。 – Chuck 2010-10-12 18:14:48

+0

我打算把這個標記爲正確的,因爲現在基本上這是最好的答案。 – 2010-10-15 21:18:02

1

我可以想到另一個不錯的選擇,讓你的if/else邏輯保持局部視圖。

您可以創建一個HtmlHelper擴展方法。 HtmlHelper是在視圖中調用諸如Html.ActionLink之類的東西時使用的對象。你可以編寫自己的方法來生成你想要的任何HTML。該條件語句都需要在擴展方法的地方,您的視圖代碼被簡化爲:

<%= Html.MyControl(param1, param2) %> 

拇指何時創建的HtmlHelper擴展方法決定以及何時創建的局部視圖時,我遵循的規則一般是多少HTML將被生成。如果我最終得到了幾行HTML格式,部分控件通常是最好的選擇,因爲它通常更易於理解和維護HTML。

如果您擔心組織大量部分視圖,則可以在共享視圖目錄下創建子文件夾。意見然後可以像這樣引用:

<% Html.RenderPartial("Subfolder/PartialView") %> 
+0

謝謝,我已經考慮過所有這些方法。問題是單個視圖將被拆分成多個不同的局部視圖。我正在單獨工作的人只有20-30個ascx文件。重點是基本上能夠包裝任意小塊的內容,並且如果沒有滿足標準的站點範圍內的條件,則替換其他內容。 – 2010-10-12 13:50:33

+0

...所以這些控件不會在任何地方重複使用,部分只會導致您的項目混亂。讓我再試一次,不同的答案... – Chuck 2010-10-12 14:10:22

0

我只是想到了一個替代解決方案的:

<% if(!BlockContentAndRenderPlaceHolder(Feature.Whatever)) { %> 
whatever 
<% } %> 

我知道這看起來有點遲鈍,但如果你看到這些網頁上的內容, '明白。

相關問題