i want to load a user control using jquery ajax. One possible i found is to load usercontrol through generic handler. Anyone help me plsss. here the ajax code i am using to call the control.
<script type="text/javascript">
function fillSigns() {
$.ajax({
url: "usercontrolhandler.ashx?control=signs.ascx",
context: document.body,
success: function (data) {
$('#signdiv').html(data);
}
});
}
</script>
and here is the code in handler file
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
Page page = new Page();
UserControl ctrl = (UserControl)page.LoadControl("~/" + context.Request["control"] + ".ascx");
page.Form.Controls.Add(ctrl);
StringWriter stringWriter = new StringWriter();
HtmlTextWriter tw = new HtmlTextWriter(stringWriter);
ctrl.RenderControl(tw);
context.Response.Write(stringWriter.ToString());
}
This code raises object reference not found error at below shown line.
page.Form.Controls.Add(ctrl);
It seems page.Form is null here, that's why you've got a null reference exception. You could add your user control to the page's control collection instead:
page.Controls.Add(ctrl);
You could also use HttpServerUtility.Execute method for page rendering:
StringWriter output = new StringWriter();
HttpContext.Current.Server.Execute(page, output, false);
And finally take a look onto Tip/Trick: Cool UI Templating Technique to use with ASP.NET AJAX for non-UpdatePanel scenarios article by Scott Guthrie which covers your problem.
Try this:
Page page = new Page {ViewStateMode = ViewStateMode.Disabled};
HtmlForm form = new HtmlForm { ViewStateMode = ViewStateMode.Disabled };
form.Controls.Add(ctrl);
page.Controls.Add(form);
then:
StringWriter stringWriter = new StringWriter();
HtmlTextWriter tw = new HtmlTextWriter(stringWriter);
page.RenderControl(tw);
context.Response.Write(stringWriter.ToString());
Related
I am working on a asp.net MVC with kendo UI.
I want a custom button to install the data from a specific date into Excel.
I cannot use the ".Excel" in the grid because I need to filter the data before I install them.
I tried to connect to a method with ajax request:
toolbar.Template(
#<div>
<label>#WebResources.LogFilterText</label>
#(Html.Kendo().DatePicker()
.Name("datepicker")
.Value(DateTime.Today)
.Format("dd.MM.yyyy")
)
#(Html.Kendo().Button()
.Name("excelButton")
.Events(e => e.Click("getExcel"))
.Content("To Excel")
)
</div>
)
this is the javscript function:
function getExcel() {
var url = '/LogAdmin/GetExcel/';
$.ajax({
url: url,
data: { id: kendo.toString($("#datepicker").data("kendoDatePicker").value(), "dd.MM.yyyy") }, //parameters go here in object literal form
type: 'GET',
datatype: 'json',
success: function (data) {
alert("da");
$("#test").html(data);
},
error: function () { alert("Error has been accured."); }
});
}
and here is the controller method:
public ActionResult GetExcel([Bind(Prefix = "id")] string date)
{
// result is a valid list from Linq.
GridView gridview = new GridView();
gridview.DataSource = result;
gridview.DataBind();
// Clear all the content from the current response
Response.ClearContent();
Response.Buffer = true;
// set the header
Response.AddHeader("content-disposition", "attachment; filename = itfunda.xls");
Response.ContentType = "application/ms-excel";
Response.Charset = "";
// create HtmlTextWriter object with StringWriter
using (StringWriter sw = new StringWriter())
{
using (HtmlTextWriter htw = new HtmlTextWriter(sw))
{
// render the GridView to the HtmlTextWriter
gridview.RenderControl(htw);
// Output the GridView content saved into StringWriter
Response.Output.Write(sw.ToString());
Response.Flush();
Response.End();
}
}
return View();
}
I do not get an error, and I receive an html table. if I show it on a div then it looks a like a correct table.
but how to save it to excel? anybody can help me?
I have this code:
public static string RenderView(string path)
{
Page pageHolder = new Page();
UserControl viewControl = (UserControl)pageHolder.LoadControl(path);
pageHolder.Controls.Add(viewControl);
StringWriter output = new StringWriter();
HttpContext.Current.Server.Execute(pageHolder, output, false);
return output.ToString();
}
Which is run from:
[WebMethod]
public string GetReportsHTML()
{
string output = "";
output = ViewManager.RenderView("ReportsControl.ascx");
return output;
}
This is to test rendering ASCX files and spitting them out of a SOAP/REST service.
Problem is, some controls (runat=server ones) fail if they are not encapsulated in a tag with runat=server.
The solution to that is here, but the solution assumes being inside an ASPX file where I can just edit the markup.
How would I programmatically build a Page, add a Form, set runat=server so that I can follow that solution and add my control to the Form Control?
Have you tried something like this ?
public static string RenderView(string path)
{
Page pageHolder = new Page();
System.Web.UI.HtmlControls.HtmlForm formHolder = new System.Web.UI.HtmlControls.HtmlForm();
pageHolder.Controls.Add(formHolder );
UserControl viewControl = (UserControl)pageHolder.LoadControl(path);
formHolder.Controls.Add(viewControl);
StringWriter output = new StringWriter();
HttpContext.Current.Server.Execute(pageHolder, output, false);
return output.ToString();
}
Hope this will help
I develop a custom usercontrol. For a specific need, I have to get the html generate from usercontrol inside it and display only it in the page's body.
I think it's possible overloading RenderControl(HtmlTextWriter writer) but I don't know how.
Thanks
You can render the control in memory, have it on a string, and then print this string somewhere on your page as you say. Here is the code that loads the control and renders it on memory, then have the results on a string.
// load the control
var oTesto = Page.LoadControl("Testo.ascx");
// here you need to run some initialization of your control
// because the page_load is not loading now.
// a string writer to write on it
using(TextWriter stringWriter = new StringWriter())
{
// a html writer
using(HtmlTextWriter GrapseMesaMou = new HtmlTextWriter(stringWriter))
{
// now render the control inside the htm writer
oTesto.RenderControl(GrapseMesaMou);
// here is your control rendered output.
strBuild = stringWriter.ToString();
}
}
To capture the rendering of your control you can use the Render as:
protected override void Render(HtmlTextWriter writer)
{
System.IO.StringWriter stringWriter = new System.IO.StringWriter();
HtmlTextWriter htmlWriter = new HtmlTextWriter(stringWriter);
// now the control is inside the htmlWriter as final rendered text
base.Render(htmlWriter);
// here is how to make the control render itself
// base.Render(writer);
}
You place the render inside your control class.
I am trying to get the rendered HTML of Ajaxtoolkit:Editor control. I am getting an error while rendering here is my code:
[WebMethod]
public static string GetHtmlEditor()
{
CustomHTMLEditor objCustom = new CustomHTMLEditor();
StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);
HtmlTextWriter textWriter = new HtmlTextWriter(sw);
UpdatePanel up = new UpdatePanel();
up.ID = "upId";
up.ContentTemplateContainer.Controls.Add(objCustom);
up.RenderControl(textWriter);
return textWriter.ToString();
}
Error: Page cannot be null. Please ensure that this operation is being performed in the context of an ASP.NET request.
I tried executing directly i.e without using UpdatePanel. Still it throws the same error.
Can i render Ajaxtoolkit controls?
I want to use an ascx as a template, and render it programatically, using the resulting html as the return value of an ajax method.
Page pageHolder = new Page();
MyUserControl ctlRender = (MyUserControl)pageHolder.LoadControl(typeof(MyUserControl),null);
pageHolder.Controls.Add(ctlRender);
System.IO.StringWriter swOutput = new System.IO.StringWriter();
HttpContext.Current.Server.Execute(pageHolder, swOutput, false);
return swOutput.ToString();
This all executes, and the Page Load event of the user control fires, but the StringWriter is always empty. I've seen similar code to this in other examples, what am I missing?
Have you tried this:
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();
}
Taken directly from the article here:
ASP.NET Tip: Render Control into HTML String
You always have to use something like this.Controls.Add(TemplateControl.LoadControl("~/PathTo/YourControl.ascx")
The reason is, that there is no internal mapping of Types to there ascx-file (only the other way arround). So this means if you initialize new YourControl(), it will not do anything you defined in the ascx part. If you would have
protected override void protected override void Render(HtmlTextWriter output) {
output.WriteLine("Test");
}
this would give you "Test" in the place you rendered your control to.