WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Ladda in UserControl med HtmlForm med jQuery (https://www.wn.se/forum/showthread.php?t=37507)

peterbf 2009-06-21 13:00

Tjenare!

Har en profilmeny för varje användare där länken är i detta format: Profile.aspx?Id=584.

Profilmenyn är uppbyggd av jQuery.tabs() och varje gång man klickar på en flik så körs en jQuery.ajax-GET mot en Generic Handler (*.ashx) som hämtar en användarkontroll och konverterar denna till en String som jag sedan addera i flikens content-<div>. Detta gör jag med följande kod:
Kod:

          string userControl = context.Request.QueryString["userControl"].ToString();
 
          string fullPath = path + userControl + ext;
 
          string userControlOutput = [I]UserControlUtilities.ControlAsString(fullPath);[/I]
 
          context.Response.Write(userControlOutput);

Om man har serverkontroller vilket jag givetvis har i mina användarkontroller så krävs det en <form>-tagg runt dessa när de laddas in dynamiskt som i mitt fall. Denna skapar jag programmatiskt i min UserControlUtilities.ControlToString()-metod som ser ut som följer:
Kod:

  public static string ControlAsString(string ucPath) {
 
        Page page = new Page();
        page.EnableViewState = false;
        UserControl userControl = page.LoadControl(ucPath) as UserControl;
 
        HtmlForm form = new HtmlForm();
 
        form.ID = "ProfileForm";
       
        form.Controls.Add(userControl);
 
        page.Controls.Add(form);
 
        StringWriter writer = new StringWriter();
 
        HttpContext.Current.Server.Execute(page, writer, true);
 
        return writer.ToString();
      }

<form>-taggen renderas såhär i Html-koden...
<form id="ProfileForm" onsubmit="javascript:return WebForm_OnSubmit();" action="/GenericHandlers/ProfileMenu.ashx" method="post" name="ProfileForm">

... vilket betyder att varje gång det sker en knapptryckning eller nåt likande så skickas man till <form>-taggens Action-attribut då den skapas i min Generic Handler (ProfileMenu.ashx).

Jag har försökt att programmatiskt sätta form.Action = "Profile.aspx?Id=584"; i ControlToString(), då postas man till rätt adress men knappen/dropdownlist eller nåt annat som har ett Event av nåt slag körs aldrig.

Någon som upplevt detta tidigare? Har ni nåt förslag på lösning?

digiArt 2009-06-21 15:11

Hej,

Jag har svårt att utläsa vad du är ute efter. Men om dina användarkontroller endast renderar innehåll och inte behöver ha några events så fungerar följande (i mina enkla tester). Jag har utgått ifrån att allting ligger i någon form av övergripande form-tagg (som normalt är i asp.net). Dvs, det verkar överflödigt att bygga upp en sida för varje kontroll på serversidan istället för att bara rendera innehållet.

Om jag missförstått så får du gärna förtydliga.

Kod:

<%@ WebHandler Language="C#" Class="Handler" %>

using System;
using System.Text;
using System.IO;
using System.Web;
using System.Web.UI;

public class Handler : IHttpHandler {
  private string path = "~/Controls/";
  public void ProcessRequest (HttpContext context) {
    string control = context.Request.QueryString["userControl"] as string;
   
    string fullpath = path + control + ".ascx";

    System.Web.UI.UserControl c = new System.Web.UI.UserControl();
    System.Web.UI.Control cont = c.LoadControl(fullpath);
    context.Response.ContentType = "text/plain";
    context.Response.Write(RenderControl(cont));
  }
  public string RenderControl(Control ctrl)
  {
    StringBuilder sb = new StringBuilder();
    StringWriter tw = new StringWriter(sb);
    HtmlTextWriter hw = new HtmlTextWriter(tw);

    ctrl.RenderControl(hw);
    return sb.ToString();
  }

  public bool IsReusable {
    get {
      return false;
    }
  }

}


peterbf 2009-06-21 15:46

Laddar du in en användarkontroll med serverkontroller så krävs det en <form>-tagg runt, annars kastar den ett felmeddelande.

Det är just eventen som inte triggas. Event har jag ju till varje t.ex. asp:Button. Problemet är som sagt att den postar till form-taggens Action-attribut som är fel, och eventet körs aldrig, vad krävs för att eventet ska köras som vanligt och att action-attributet ska ha det värde som gör att allt fungerar?

digiArt 2009-06-21 16:17

Misstänkte att det var det du var ute efter. Är det den här artikeln du har utgått ifrån, som i sin tur pekar på den här artikeln.

Titta igenom deras kodexempel. Det där med action-attributet är en riktig pain när det gäller asp.net, särskilt i kombination med urlrewriting. Vet inte hur många timmar jag bråkat med det.

peterbf 2009-06-21 21:07

Citat:

Originally posted by digiArt@Jun 21 2009, 16:17
Misstänkte att det var det du var ute efter. Är det http://samuelmueller.com/post/2008/1...th-jQuery.aspx du har utgått ifrån, som i sin tur pekar på http://blog.ovesens.net/post/Dynamic...th-jQuery.aspx.

Titta igenom deras kodexempel. Det där med action-attributet är en riktig pain när det gäller asp.net, särskilt i kombination med urlrewriting. Vet inte hur många timmar jag bråkat med det.

Nej, det var inte de länkarna, han använder en Web Service, men principen är ju densamma.

Löste du det då?

digiArt 2009-06-21 22:04

Citat:

Ursprungligen postat av peterbf
Citat:

Ursprungligen postat av digiArt
Misstänkte att det var det du var ute efter. Är det http://samuelmueller.com/post/2008/12/20/D...ith-jQuery.aspx du har utgått ifrån, som i sin tur pekar på http://blog.ovesens.net/post/Dynamically-L...ith-jQuery.aspx.

Titta igenom deras kodexempel. Det där med action-attributet är en riktig pain när det gäller asp.net, särskilt i kombination med urlrewriting. Vet inte hur många timmar jag bråkat med det.

Nej, det var inte de länkarna, han använder en Web Service, men principen är ju densamma.

Löste du det då?

Ja, med en controladapter.

Men jag fattar inte riktigt, får du inte dubbla form-taggar? Har inte jobbat med att rendera på det sättet.

Tittade du igenom exemplen? Gav de ingen hjälp? Testat forumen på asp.net?

peterbf 2009-06-21 22:12

Jo det blir ju dubbla form-taggar, men i.o.m. att de laddas in asynkront måste detta ske.

Nej, de skiljer inte sig mycket från min kod.

Ja det har jag, inväntar svar därifrån.

Vad för ControlAdapter?

digiArt 2009-06-21 22:28

Citat:

Originally posted by peterbf@Jun 21 2009, 22:12
Jo det blir ju dubbla form-taggar, men i.o.m. att de laddas in asynkront måste detta ske.

Nej, de skiljer inte sig mycket från min kod.

Ja det har jag, inväntar svar därifrån.

Vad för ControlAdapter?

En modifierad variant av Scotts som finns länkad i hans artikel.

peterbf 2009-06-21 23:34

Laddade hem detta kodexemplet för att studera koden:
http://www.scottgu.com/blogposts/url...ttpModule1.zip

Han använder ju bara HttpContext.Current.Request.RawUrl, har testat det också men då postar den ju till min generic handler.

Kan du visa ett litet exempel på din kod då? Hade uppskattats som fan, har slitit med detta i två dagar nu :)

digiArt 2009-06-22 19:28

Jag läser också rawurl.

Men du, varför strippar du inte bara bort form-taggen från din renderade control?

Och jag undrar också, om du renderar en control och puttar in den asyncront. Hur vet ramverket att den ska köra codebehind för den koden i den kontrollen. Kontrollen fanns inte med i control-collection från första början??

Det är antagligen därför som dina events inte körs när du bygger om action-attributet. Så för att få det att fungera måste du posta med vilka kontroller som är tillagda asyncront, lägga till dem tidigt i sidans levnad för att den sen ska kunna fungera vid postback.

Lite grann som att lägga till (web)kontroller dynamiskt.

Bara en tanke...

Vad har du utgått från för exempel för att (försöka) få detta att lira?

pbf 2009-06-23 07:34

Ahaa, det är därför eventen inte körs! Tack för den!

Jag har 12 flikar, i vissa flikar finns t.o.m. "underflikar" och i varje flik finns en UserControl med serverkontroller, betyder detta att jag måste ladda in samtliga serverkontroller dynamiskt och placera där jag vill ha dem för att eventen ska triggas?

digiArt 2009-06-23 11:45

Citat:

Originally posted by pbf@Jun 23 2009, 07:34
Ahaa, det är därför eventen inte körs! Tack för den!

Jag har 12 flikar, i vissa flikar finns t.o.m. "underflikar" och i varje flik finns en UserControl med serverkontroller, betyder detta att jag måste ladda in samtliga serverkontroller dynamiskt och placera där jag vill ha dem för att eventen ska triggas?

Ja.

Jag tycker visserligen att det låter som en designmiss på något sätt eftersom du måste slå knut på dig för att få det att funka.

pbf 2009-06-23 14:10

? Jag laddar in användarkontroller genom en GenericHandler som de flesta gör, men jag använder jQuery() för att hämta och lägga strängen (som är ett skapande av användarkontrollen) i en <div>:

Kod:

    function ChangeTab(userControl) {

      J.ajax({
        type: "GET",
        datatype: 'html',
        url: "GenericHandlers/ProfileMenu.ashx",
        data: "userControl=" + userControl,
        cache: false,
        success: function(content) { J("#" + userControl).html(content); }
      });
    }

    J(document).ready(function() {

      J("#user-profile-menu > ul").tabs();
      J("#user-profile-menu").fadeIn("fast");

      J(".tabOption").click(function() {

        var userControl = J(this).attr('rel');

        ChangeTab(userControl);
      });

    });


digiArt 2009-06-23 18:59

Citat:

Originally posted by pbf@Jun 23 2009, 14:10
... de flesta gör ...
Hmmm, har inte ens sett förslaget att göra så under de åtta år jag knackat .NET mot webb. Undrar vilken sten jag bott under...

pbf 2009-06-23 21:22

Okej. Om vi undviker det och fokuserar på trådens huvudämne (givetvis ingen negativ intention), hur bör jag ladda in användarkontrollen med jQuery men ändå kunna klicka på mina grejer så eventen triggas?

Allt gott, digiArt.

digiArt 2009-06-23 21:46

Citat:

Originally posted by pbf@Jun 23 2009, 21:22
Okej. Om vi undviker det och fokuserar på trådens huvudämne (givetvis ingen negativ intention), hur bör jag ladda in användarkontrollen med jQuery men ändå kunna klicka på mina grejer så eventen triggas?

Allt gott, digiArt.

Det är lugnt... B)

Eftersom jag själv inte gjort något sådant tidigare så har jag tyvärr inte så mycket mer kreativ input att komma med än den jag redan gjort.

Varför inte loopa igenom samtliga kontroller i den mottagande sidan och se om du fångar den control du lagt till via jquery.

Dvs, ngt i stil med:
Kod:

bool found = false;
foreach(Control c in Page.Controls)
{
if(c is [din kontrolltyp])
{
// wohoo, den fanns
found = true;
}
}
if(!found)
{
// rackarns, den fanns inte
}

Jag gissar på att du kommer få "rackarns...". Särskilt som det är grymt knepigt att utröna vad kontrollerna egentligen heter när de är usercontrols (.ascx).

Om du inte hittar den, ja, då blir det till att skapa upp kontrollen vid postback och se till så att eventen kan köras.

Tydligare än så här kan jag inte bli.

Lycka till!

pbf 2009-06-24 09:22

Okej.

Har bestämt mig för att skita i det asynkrona då det helt enkelt inte går, de flesta instämmer där. (att kunna få med eventen osv).

Om jag har en meny med jQuery-tabs, vilket sätt hade du valt för att ladda in användarkontroller (sidan får ladda om)? Vill inte ladda in alla samtidigt utan när man klickar på en så vill jag att den ska laddas in och sedan visas för just den fliken. En flik definieras av "#Guestbook" eller nåt liknande efter Profile.aspx?Id=40

pbf 2009-06-24 10:17

Kravet är förresten att man efter en postback i varje flik ska komma till samma flik, har inte kommit på nåt sätt att göra detta ännu, QueryStrings vill man ju ogärna använda. Att skickas till Profile.aspx?Id=40#Guestbook ser bättre ut om detta är doable?

Onkelborg 2009-06-24 13:58

Måste du posta det? Kan du inte likaväl skicka rubb och stubb via js direkt till servern?


Alla tider är GMT +2. Klockan är nu 02:12.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson