雖然我們在Substitution控件中使用的方法應該返回字符串,那麼如何在應該呈現服務器端的服務器控件的Web表單中使用donut caching?
例如Loginview控件?如何在替代控件中使用ASP.Net服務器控件?
5
A
回答
6
UPDATE 這是一個完整的工作示例。這裏發生了一些事情:
- 使用替換控件的回調來呈現您需要的usercontrol的輸出。
- 使用覆蓋VerifyRenderingInServerForm和EnableEventValidation的自定義頁面類來加載控件,以防止在usercontrol包含需要表單標記或事件驗證的服務器控件時引發錯誤。
這裏的標記:
<asp:Substitution runat="server" methodname="GetCustomersByCountry" />
這裏的回調
public string GetCustomersByCountry(string country)
{
CustomerCollection customers = DataContext.GetCustomersByCountry(country);
if (customers.Count > 0)
//RenderView returns the rendered HTML in the context of the callback
return ViewManager.RenderView("customers.ascx", customers);
else
return ViewManager.RenderView("nocustomersfound.ascx");
}
這裏的輔助類來呈現用戶控制
public class ViewManager
{
private class PageForRenderingUserControl : Page
{
public override void VerifyRenderingInServerForm(Control control)
{ /* Do nothing */ }
public override bool EnableEventValidation
{
get { return false; }
set { /* Do nothing */}
}
}
public static string RenderView(string path, object data)
{
PageForRenderingUserControl pageHolder = new PageForUserControlRendering();
UserControl viewControl = (UserControl) pageHolder.LoadControl(path);
if (data != null)
{
Type viewControlType = viewControl.GetType();
FieldInfo field = viewControlType.GetField("Data");
if (field != null)
{
field.SetValue(viewControl, data);
}
else
{
throw new Exception("ViewFile: " + path + "has no data property");
}
}
pageHolder.Controls.Add(viewControl);
StringWriter result = new StringWriter();
HttpContext.Current.Server.Execute(pageHolder, result, false);
return result.ToString();
}
}
個
看到這些相關的問題:
-1
我相當某些你不能做到這一點 - Substitution控件將只允許你插入一個字符串轉換爲outputcached頁。
如果您考慮服務器控件的整個輸出,這可能是一個<table>
,這會破壞您的精心製作的標記和/或需要加載<script>
注入頁面的東西 - 而注入單個字符串是相對簡單的東西。
0
一個Micah的回答漏掉的是,替代函數必須static
,接受HttpContext
參數,並返回一個東西string
。有關更多信息,請參閱this msdn page。
我也擴展了Micah的輔助類,使它更加靈活一些。
標記
<asp:Substitution ID="Substitution1" MethodName="myFunction" runat="server" />
再次實行
public static string myFunction(HttpContext httpContext){
ViewManager vm = new ViewManager();
//example using a Button control
Button b = new Button();
b.Text = "click me"; //we can set properties like this
//we can also set properties with a Dictionary Collection
Dictionary<string,object> data = new Dictionary<string,object>();
data.add("Visible",true);
String s = vm.RenderView(b,data); //don't do anything (just for example)
//we can also use this class for UserControls
UserControl myControl = vm.GetUserControl("~mypath");
data.clear();
data.add("myProp","some value");
return vm.RenderView(myControl,data); //return for Substitution control
}
類
using System.IO;
using System.ComponentModel;
public class ViewManager
{
private PageForRenderingUserControl pageHolder;
public ViewManager()
{
pageHolder = new PageForRenderingUserControl();
}
public UserControl GetUserControl(string path)
{
return (UserControl)pageHolder.LoadControl(path);
}
public string RenderView(Control viewControl, Dictionary<string, object> data)
{
pageHolder.Controls.Clear();
//Dim viewControl As UserControl = DirectCast(pageHolder.LoadControl(Path), UserControl)
if (data != null) {
Type viewControlType = viewControl.GetType();
dynamic properties = TypeDescriptor.GetProperties(viewControl);
foreach (string x in data.Keys) {
if ((properties.Item(x) != null)) {
properties.Item(x).SetValue(viewControl, data[x]);
}
}
}
pageHolder.Controls.Add(viewControl);
StringWriter result = new StringWriter();
HttpContext.Current.Server.Execute(pageHolder, result, false);
return result.ToString();
}
private class PageForRenderingUserControl : Page
{
public override void VerifyRenderingInServerForm(Control control)
{
// Do nothing
}
public override bool EnableEventValidation {
get { return false; }
// Do nothing
set { }
}
}
}
由於Micah代碼
相關問題
- 1. 服務器控件中的服務器控件ASP.NET
- 2. 如何在c#中使用asp.net MVC中的服務器控件#
- 3. MVC中的Asp.net服務器控件替代
- 4. 如何動態地用asp.net中的另一組服務器控件替換另一組服務器控件webforms
- 5. ASP.net服務器控件和使用AjaxcontrolToolkit
- 6. asp.net服務器控件
- 7. ASP.net Web服務器控件
- 8. ASP.NET服務器控件
- 9. 在ASP.NET服務器控件中的Html
- 10. 使用javascript ASP.NET獲取服務器控件上的子控件
- 11. 如何使用Foundation 4按鈕控件到asp.net服務器控件Button?
- 12. 我如何在asp.net中調用服務器控件視圖mvc
- 13. 如何在JQuery ASP.NET中引用服務器端控件?
- 14. 什麼時候在ASP.NET中使用html控件和服務器控件..?
- 15. ASP.NET主頁服務器控件事件
- 16. ASP.NET AJAX服務器控件中的UpdatePanel
- 17. 使用ASP.Net服務器控件代碼生成.ashx
- 18. 如何在Asp.Net文件後面的代碼中訪問服務器端控件?
- 19. 如何從使用jQuery的asp.net服務器控件傳遞值?
- 20. 如何配合使用的FileUpload asp.net服務器控件的
- 21. 如何使用具有ASP.NET MVC的PostBack的服務器控件?
- 22. 服務器控件中的ASP.NET DataPager控件
- 23. 在MVC中使用ASP.NET服務器控件?
- 24. 在ASP.NET MVC中使用IZWebFileManager服務器控件
- 25. 在ASP.NET菜單服務器控件中使用RenderControl的NullReferenceException
- 26. 如何處理另一個服務器控件中的ASP.NET服務器控件的事件?
- 27. asp.net Web服務器控件與子控件,事件不觸發
- 28. 如何在功能中傳遞asp.net服務器控件類型?
- 29. 如何在asp.net中創建多頁面服務器控件?
- 30. asp.net服務器控件和html服務器控件有什麼區別
太棒了!謝謝 – mohamadreza 2010-07-25 08:05:43
-1參考資料來源:http://weblogs.asp.net/scottgu/archive/2006/10/22/Tip_2F00_Trick_3A00_-Cool-UI-Templating-Technique-to-use-with-ASP.NET-AJAX-for -non_2D00_UpdatePanel-scenarios.aspx – 2012-09-10 16:22:05