2009-11-07 51 views
5

對不起,如果這是一個基本問題 - 我在從頁面框架轉換到ASP.NET MVC時遇到了一些麻煩。在ASP.NET MVC中封裝用戶控件

在頁面框架中,我經常使用ASCX文件來創建小型封裝的功能塊,這些功能塊在整個站點的各個位置都會出現。如果我正在構建一個頁面,並且需要這些控件之一 - 我只需添加一個引用,並且所有內容都可以正常工作。

據我所知,在MVC中,ASCX文件只是部分視圖。這是否意味着無論我想添加這些功能單元中的哪一個,我還必須向控制器的操作方法添加一些代碼以確保相關的ViewData可用於ASCX?

如果是這樣的話,那對我來說似乎有點退步了。舉例來說,這意味着我不能將控件「放置」到主頁面中,而無需將代碼添加到其視圖使用該主頁面的每個控制器!

我懷疑我錯過了什麼 - 任何幫助將不勝感激。

謝謝, 克里斯 -

+0

不要說抱歉,因爲這不是真的,所有閱讀此博客的讀者都是asp.net或mvc專家 – 2009-11-07 00:47:06

+0

+1對於您的問題語法是你編輯我的問題,然後去我的個人資料,然後編輯我的問題,因爲我在英語方面沒有很好的知識 – 2009-11-07 00:49:17

回答

3

據我所知,在MVC中,ASCX 文件只是一個局部視圖。這是否 意味着,只要我想補充一個 的功能,這些單位我也 有一些代碼添加到 控制器的操作方法,使 確保相關的ViewData的是 可供ASCX?

是的。

不過,您可以在您的視圖,而不是RenderPartial使用RenderAction方法,以及您的所有功能(包括數據被傳遞到子視圖)將被封裝。

換句話說,這將創建一個包含控制器方法,視圖數據和局部視圖的小包,可以在主視圖中用一行代碼調用它。

+0

優秀 - RenderAction是我錯過的難題!非常感謝! – 2009-11-07 00:50:44

+0

也可以看看這篇文章http://blog.codeville.net/2008/10/14/partial-requests-in-aspnet-mvc/的一些其他選擇。 – joshperry 2009-11-07 00:51:33

+0

下面是RenderAction的更好的概述:http://blogs.intesoft.net/post/2009/02/renderaction-versus-renderpartial-aspnet-mvc.aspx – 2009-11-07 01:00:05

1

您可以渲染局部視圖並將模型對象傳遞給。

<% Html.RenderPartial("MyPartial", ViewData["SomeObject"]); 

在您的局部視圖(的.ascx)文件,然後您可以使用「模型」對象(假設你已經繼承了你的@控制減速正確的對象)做任何你需要與該對象。

你可以,當然,不通過和模型,只是採取局部視圖的文本,並將其放在你想要的地方。

在您的主視圖(.aspx文件)中,您需要在ViewData中定義傳遞給部分視圖的正確對象。

你可以做的另一種方法是使用:

<% Html.RenderAction("MyAction", "MyController", new { Parameter1="Value1"}) %> 

什麼以前的方法所做的就是調用控制器動作,接受其響應,並把它放在你叫「的RenderAction()」方法。它相當於對控制器動作運行請求並讀取響應,除了將響應放在另一個文件中。

谷歌「renderaction和renderpartial」的一些更多的信息。

+0

優秀 - RenderAction是我失蹤的難題!非常感謝! – 2009-11-07 00:50:09

2

您的問題已經得到解答,但僅僅爲了完整性,您還可以選擇其他選項。

你見過在ASP.NET MVC上如何屏蔽「控件」嗎?他們是「HtmlHelper」的方法。如果你想綁定到「姓」文本框,例如,你可以這樣做:

<%= Html.Textbox("FirstName") %> 

而且你有這樣的事情對於許多標準控件。

你可以做的是創建你自己的方法。要創建自己的方法,你必須對HtmlHelper類創建擴展方法,像這樣:

public static class HtmlHelperExtensions 
{ 
    public static string Bold(this HtmlHelper html, string text) 
    { 
     return "<b>" + text + "</b>\n"; 
    } 
} 

然後在您的視圖,打開包含這個類定義的命名空間後,您可以使用它像這樣:

<%= Html.Bold("This text will be in bold-face!") %> 

那麼,這不是特別有用。但是你可以做很有趣的事情。我經常使用的一種方法是枚舉並使用此枚舉值創建一個下拉列表(例如:enum Gender { Male, Female },在視圖中類似於Gender: <%= Html.EnumDropDown(Model.Gender) %>)。

祝你好運!