2010-01-07 6 views
5

J'ai un service Web à partir de laquelle j'ai besoin de retourner une chaîne contenant du code HTML. Ce code HTML est le balisage d'un contrôle Select (à utiliser dans les filtres de recherche jqGrid), par ex.retourner le code HTML du service wcf

<select><option id='1'> value 1 </option></select> 

Mon service Web WCF contient une méthode qui renvoie cette valeur comme une chaîne ...

public string GetLeadTypeSelect() 
{ 
    return "<select><option id='1'> value 1 </option></select>"; 
} 

et le contrat de cette méthode est:

[OperationContract] 
[WebInvoke(Method = "GET", 
    BodyStyle = WebMessageBodyStyle.Bare, 
    ResponseFormat = WebMessageFormat.Json)] 
string GetLeadTypeSelect(); 

Mon problème est que les caractères d'échappement sont insérés dans la chaîne afin de rendre le HTML renvoyé inutilisable - le service renvoie ceci:

"<select><option id='1'> value 1 <\/option><\/select>" 

Les guillemets et le '/' échappé dans les étiquettes de fermeture <option> et <select> posent tous les deux des problèmes.

jqGrid utilise le code HTML retourné pour afficher le menu déroulant ...

filterModel: [ 
    { label: 'Type', name: 'type', stype: 'select', surl: '../../../Services/Leads/GetLeads.svc/GetLeadTypeSelect' }, 

Alors, ma question est, comment je retourne HTML pur au client de ce service Web afin qu'il puisse être inséré dans ma page HTML? Merci d'avance pour toute aide, Colin.

Répondre

0

Je suppose que vous l'utilisez via Javascript.

Si vous faites unescape (réponse), votre problème devrait être résolu. D'un autre côté, si vous ne l'utilisez pas en Javascript mais seulement sur un site ASP.NET/PHP/quel que soit le site, il vaut mieux retourner simplement un tableau de valeurs et de valeurs d'affichage, pour que vous puissiez réutiliser le webservice dans un autre code.

Votre morceau de code ne fonctionne désormais que dans un environnement HTML. Que faire si vous avez besoin d'écrire une application .NET/C++/any demain qui utilise votre service web? Ensuite, vous devrez le changer. Et ce n'est pas le but des webservices. Les services Web favorisent la réutilisabilité du code. Et vous vous battez contre cela. (Et le code va gagner!)

+0

Merci Snake pour la réponse. Malheureusement, mes mains sont un peu liées. J'utilise jqGrid, et la seule façon de créer un ddl pour les paramètres de recherche est d'appeler un service web qui renvoie le html. J'ai modifié la question pour refléter cela. Je n'ai pas la possibilité de manipuler la chaîne renvoyée sinon je pourrais annuler le javascript. – Col

6

Je sais que c'est un ancien poste, mais pour un service qui ne sera hébergé dans IIS, voici un moyen facile de retourner html:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)] 
public Stream getHtml() 
{ 
    // get the html 
    var html = DoSomethingToGetHtml(); //Not a built-in .Net method ;) 

    // we want our result interpreted as plain html 
    WebOperationContext.Current.OutgoingResponse.ContentType = "text/html; charset=utf-8"; 

    // create a stream from our html because trying to return a string adds an extra header tag 
    //  to the response. Returning a stream returns the html by itself 
    var result = new MemoryStream(Encoding.UTF8.GetBytes(html)); 

    // return the result 
    return result; 
} 

Ce code exige ce qui suit dans le web.config qui héberge le service:

<system.serviceModel> 
    <!-- enable HttpContext.Current by setting aspNetCompatibilityEnabled=true--> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/> 

    <behaviors> 
     <endpointBehaviors> 
      <behavior name="webHttpEnabled">    
       <webHttp/> 
      </behavior> 
     </endpointBehaviors> 
    </behaviors> 
    ... 
<system.serviceModel> 

dans la configuration du service, définissez behaviorConfiguration="webHttpEnabled". Renvoyer le html de cette manière limite un peu la réutilisabilité du service, mais c'est un moyen facile de résoudre le problème si vous êtes raisonnablement sûr que le service sera toujours hébergé dans IIS.

+0

Erreur L'attribut 'AspNetCompatibilityRequirements' n'est pas valide pour ce type de déclaration. Il n'est valable que sur les déclarations 'class'. –

Questions connexes