2009-06-10 14 views
15

क्या कोई यह बता सकता है कि सर्वर.एक्सक्यूट() को मेरे प्रस्तुत किए गए UserControls को <form> टैग (या वैकल्पिक रूप से, मैं सर्वर को बना रहा हूं जो गलत कर रहा हूं) की आवश्यकता है। निष्पादित करें() को मेरे UserControls में फॉर्म टैग की आवश्यकता है)?एएसएमएक्स वेब सेवा में सर्वर.एक्सक्यूट() का उपयोग कर UserControl को प्रस्तुत करने वाले मुद्दे

इस प्रकार मैं एक ASMX सेवा गतिशील JQuery + JSON के माध्यम से UserControls लोड करने के लिए बनाया है:

ControlService.asmx

<%@ WebService Language="C#" CodeBehind="ControlService.asmx.cs" Class="ManagementConcepts.WebServices.ControlService" %> 

ControlService.cs

[WebService(Namespace = "http://tempuri.org/")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
[System.Web.Script.Services.ScriptService] 
public class ControlService : System.Web.Services.WebService 
{ 
    private string GetControl(String controlName, String ClassId) 
    { 
     Page page = new Page(); 
     UserControl ctl = (UserControl)page.LoadControl(controlName); 

     page.Controls.Add(ctl); 
     StringWriter writer = new StringWriter(); 
     HttpContext.Current.Server.Execute(page, writer, false); 
     return writer.ToString(); 
    } 
    [WebMethod] 
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
    public string GetSimpleControl(string ClassId) 
    { 
     return GetControl("SimpleControl.ascx", ClassId); 
    } 
} 

मैं में नियंत्रण लोड JQuery के निम्न बिट के माध्यम से एक पृष्ठ जो आईडी सामग्री प्लेसहोल्डर के साथ एचटीएमएल के साथ सेवा से लौटाता है:

JQueryControlLoadExample.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="JQueryControlLoadExample.aspx.cs" Inherits="ControlService_Prototype._Default" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml" > 
<head runat="server"> 
    <title>ControlService Prototype</title> 
</head> 
<body> 
    <form id="theForm" runat="server" action="JQueryControlLoadExample.aspx"> 
     <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true" > 
      <Scripts> 
       <asp:ScriptReference NotifyScriptLoaded="true" Path="~/Scripts/jquery-1.3.2.js" /> 
      </Scripts> 
     </asp:ScriptManager> 
     <div> 
     <asp:HiddenField runat="server" ID="hdncourse"/> 
     <asp:HiddenField runat="server" ID="hdnTargetContent" Value="GetSimpleControl"/> 
     <div runat="server" id="ContentPlaceholder" class="loading"></div> 
     </div> 
     <script type="text/javascript"> 
      $(document).ready(function() { 
       var servicemethod = document.getElementById("hdnTargetContent").value; 
       $.ajax({ 
       type: "POST", 
        url: "ControlService.asmx/" + servicemethod, 
        data: "{'ClassId':'"+document.getElementById("hdncourse").value+"'}", 
        contentType: "application/json; charset=utf-8", 
        dataType: "json", 
        success: function(msg) { 
         $('#ContentPlaceholder').html(msg.d); 
        } 
       }); 
      }); 
     </script> 
    </form> 
</body> 
</html> 

यह एक बहुत बड़ा चेतावनी के साथ काम करता है।

Control 'hdnspecialoffer' of type 'HiddenField' must be placed inside a form tag with runat=server.

SimpleControl.ascx

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="SimpleControl.ascx.cs" Inherits="ControlService_Prototype.UserControls.SimpleControl" %> 
    <asp:HiddenField runat="server" ID="hdnspecialoffer"/> 
: मैं .ascx नियंत्रण के मार्कअप में एक प्रपत्र को परिभाषित नहीं है, तो HttpContext.Current.Server.Execute() निम्न संदेश के साथ एक HttpException फेंकता

जब मैंने इस के आसपास काम करने के लिए एसीएक्स नियंत्रण में एक फॉर्म टैग जोड़ा, तो फॉर्म प्रस्तुत करेगा, लेकिन रेंडरर नियंत्रण में फॉर्म टैग को फिर से लिखता है ताकि वह एएसपीएक्स पेज में परिभाषित फॉर्म के बजाय एएसएमएक्स सेवा पर वापस पोस्ट कर सके।

मैंने चारों ओर गुगल किया और स्कॉट गुथरी के उत्कृष्ट ViewManager उदाहरण की खोज की। मैं वहां जो कुछ भी करता था उससे मूल रूप से अलग नहीं दिखता, जिससे मुझे विश्वास होता है कि मैं जो कर रहा हूं वह काम करना चाहिए।

उत्तर

21

एक रूप में नियंत्रण उत्तर की तरह ViewManager

आप एक वर्ग है कि पृष्ठ से विरासत और सर्वर के लिए चेक ओवरराइड करता है चाहता हूँ के लिए टिप्पणियों में दफनाया गया था लगता है

public class FormlessPage : Page 
{ 
    public override void VerifyRenderingInServerForm(Control control) 
    { 
    } 
} 

फिर जब नहीं आप नियंत्रण प्रस्तुत करना,

Page page = new FormlessPage(); 
UserControl ctl = (UserControl)page.LoadControl(controlName); 
//etc 

का उपयोग मैं तुम्हें इस तरह से प्रदान की गई किसी भी नियंत्रण से गोलीबारी की घटनाओं की क्षमता खो देंगे संभालने हूँ।

+0

मैं इस जवाब को स्वीकार करने की ओर झुका रहा हूं, क्योंकि यह सच है, लेकिन मैं इसे पहले देखना चाहता हूं (जो कुछ दिनों के लिए नहीं होगा)। –

0

आप इस प्रकार अपने GetControl() विधि को बदल सकता है:

private string GetControl(String controlName, String ClassId) 
{ 
    Page page = new Page(); 
    StringWriter writer = new StringWriter(); 
    page.Server.Execute(controlName, writer, false); 
    return writer.ToString(); 
} 
+0

System.Web.UI.Page किसी भी जहाँ तक मैं बता सकता हूँ निष्पादित() विधि नहीं है। क्या आपका मतलब है 'पृष्ठ। सर्वर। निष्पादन (नियंत्रण नाम, लेखक, झूठा) '? –

+0

क्षमा करें। मेरा मतलब यही था। – ichiban

+0

दुर्भाग्यवश, यह UserControls (.ascx) के लिए काम नहीं करता है। पेज। सर्वर। निष्पादन() केवल .aspx पृष्ठों के लिए काम करता है। –

1

अपने उपयोगकर्ता नियंत्रण पर एक asp.net छिपा नियंत्रण का उपयोग करने के बजाय, बस कोड टैग <%%> के साथ एक नियमित एचटीएमएल छिपा इनपुट का उपयोग इस तरह के डेटा को भरें:

<input id="Hidden1" type="hidden" value="<%= text %>"/> 

"पाठ" फ़ाइल के पीछे कोड में एक सार्वजनिक चर है।

यह मेरे लिए काम करता था और runat="server" के साथ एक फॉर्म की आवश्यकता नहीं थी।

+0

आपका विचार इस मामले में काम नहीं करेगा। मेरा उदाहरण ब्राउज़र से वेब सेवा को आमंत्रित करता है और क्लाइंट पर जावास्क्रिप्ट में, लौटाई गई सामग्री के साथ छिपे हुए फ़ील्ड को प्रतिस्थापित करता है। <% %> सर्वर पर संसाधित किया जाता है। –

0
<System.Web.Services.WebMethod()> _ 
Public Shared Function GetDetails(ByVal filename As String) As String 
    Dim page As Page = New Page() 
    Dim ctl As recDetails = CType(page.LoadControl("~/Controles/recDetails.ascx"), recDetails) 
    ctl.FileName = filename 

    page.EnableEventValidation = False 
    Dim _form As New HtmlForm() 
    page.Controls.Add(_form) 
    _form.Controls.Add(ctl) 

    Dim writer As New System.IO.StringWriter() 
    HttpContext.Current.Server.Execute(page, writer, False) 
    Dim output As String = writer.ToString() 
    writer.Close() 
    Return output 
End Function 

आप फार्म dinamically

0
<System.Web.Services.WebMethod()> _ 
Public Shared Function GetDetails(ByVal filename As String) As String 
    Dim page As Page = New Page() 
    Dim ctl As recDetails = CType(page.LoadControl("~/Controles/recDetails.ascx"), recDetails) 
    ctl.FileName = filename 

    page.EnableEventValidation = False 
    Dim _form As New HtmlForm() 
    page.Controls.Add(_form) 
    _form.Controls.Add(ctl) 

    Dim writer As New System.IO.StringWriter() 
    HttpContext.Current.Server.Execute(page, writer, False) 
    Dim output As String = writer.ToString() 
    writer.Close() 
    Return output 
End Function 

जोड़ते हैं तो आपको फार्म जोड़ने dinamically