What if I use one literal control and assign to it - a string, dynamically built for the whole html page in it's code behind file? Will the literal control modify the output in any way? e.g. add extra html, encoding etc
E.g. ASPX file will contain just this
<%
#Page Language="VB"
Title="SamplePage"
CodeFile="SamplePageCodeBehind.aspx.vb"
Inherits="SamplePage"
%><asp:Literal Id="litContents" Runat="Server" />
And in the codebehind (SamplePageCodeBehind.aspx.vb):
Protected Sub Page_Load(
ByVal sender As Object,
ByVal e As System.EventArgs
) Handles Me.Load
Dim sHtml As String = _
"<html><head></head><body>hello world</body></html>"
litContents.Text = sHtml
End Sub
Thanks!
Instead of using the literal control, you could take the complete control over your rendering
Response.Clear()
Response.Write("any html string")
Response.Flush()
Response.End()
in your Page_Load method. This way you could be sure that no unwanted tags are rendered.
Related
I want to set asp label to catch Cookie content,
I set
<p><asp:Label ID="lblUserID" runat="server" Text=""></asp:Label></p>
in USERINFO.aspx
then set
Public Class USERINFO
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not IsPostBack Then
If (Request.Cookies("userInfo")("vID") IsNot Nothing) Then
lblUserID.Text = Request.Cookies("userInfo")("vID").ToString
End If
End If
End Sub
End Class
in USERINFO.aspx.vb
But got visual studio alert :lblUserID not defined
What should I do to connect the label correctly ?
I am not sure exactly, but you may still double-check if there's no typo in design and code-behind files.
Also, I noticed you're using ToString without parentheses, which is not correct. Please change it to -
lblUserID.Text = Request.Cookies("userInfo")("vID").ToString()
Thanks to #Andrew Morton, I solve the problem.
My issue is caused by that I didn't declare lblUserID in in USERINFO.aspx.designer.vb,
I also didn't wrote the Inherits tag in USERINFO.aspx like
<%# Page Language="vb" AutoEventWireup="false" CodeBehind="USERINFO.aspx.vb" **Inherits="MyProject.USERINFO"** %>
Correctly.
It's probably something small, but I haven't been figure out why the following isn't working completely. The first time the user submits the search, the first page of search results show up properly. However, when the user tries to navigate by using the Previous and Next Page buttons, the repeater doesn't show the appropriate data from the DataTable.
search.aspx
<asp:Repeater ID="rptSearchResults" runat="server" OnItemDataBound="rptSearchResults_ItemDataBound">
<ItemTemplate>
<div>
<asp:Literal ID="ltlCustName" runat="server" />
</div>
</ItemTemplate>
</asp:Repeater>
search.aspx.vb
Public dtCustomers As DataTable = New DataTable()
Sub Page_Load(ByVal Sender As Object, ByVal E As EventArgs) Handles Me.Load
' Check to see if this is the first time postback-ing to itself.
blnFirstPostBack = (Request.Form("firstpb") = "1")
' When the page first loads, show the search form with search options.
If Not Page.IsPostBack Then
Session("StoredDT") = Nothing
ShowSearchForm()
' Once the form is submitted, show the search results.
Else
Response.Write("DEBUG: Get Data")
If blnFirstPostBack Then
GatherFormData()
dtCustomers = BuildDT()
Session("StoredDT") = dtCustomers
BindData()
ElseIf Not Session("StoredDT") Is Nothing Then
dtCustomers = Session("StoredDT")
End If
End If
End Sub
Sub BindData()
Response.Write("DEBUG: Bind Data")
' At this point, I've checked that the dtCustomers is showing the proper data (e.g., grabbing from session when appropriate).
Dim objPDS As PagedDataSource = New PagedDataSource()
objPDS.DataSource = dtCustomers.DefaultView
objPDS.AllowPaging = True
objPDS.PageSize = intNumPerPage
' I've checked that Me.ViewState("_CurrentPage") gets updated to the correct page.
objPDS.CurrentPageIndex = Me.ViewState("_CurrentPage")
rptSearchResults.DataSource = objPDS
' I'm not sure if the error is here but although the dtCustomers is the proper data, the PagedDataSource and the binding here doesn't seem to play nice.
Call rptSearchResults.DataBind()
End Sub
' Subroutine called when the previous page button is pressed.
Sub GoToPrevPage()
Response.Write("DEBUG: Prev Page")
' Set viewstate variable to the previous page.
Me.ViewState("_CurrentPage") -= 1
BindData()
End Sub
' Subroutine called when the next page button is pressed.
Sub GoToNextPage()
Response.Write("DEBUG: Next Page")
' Set viewstate variable to the next page.
Me.ViewState("_CurrentPage") += 1
BindData()
End Sub
Protected Sub rptSearchResults_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles rptSearchResults.ItemDataBound
Dim item As RepeaterItem = e.Item
Dim strCustName As String = ""
If (item.ItemType = ListItemType.Item) Or (item.ItemType = ListItemType.AlternatingItem) Then
strCustName = e.Item.DataItem("CustName")
Dim ltlCustName As Literal = CType(e.Item.FindControl("ltlCustName"), Literal)
ltlCustName.Text = strCustName
End If
End Sub
Sample Page 1 (shows proper data):
DEBUG: Get Data
DEBUG: Bind Data
Laurence Clinton
John Doe
Sean King
Jane Smith
Sample Page 2 (does not show proper data but shows enough spaces for the missing data):
DEBUG: Get Data
DEBUG: Next Page
DEBUG: Bind Data
[no name showing here 5]
[no name showing here 6]
[no name showing here 7]
[no name showing here 8]
Please excuse the abbreviated code but the actual code is massive so the simplification is to make it easier to get to the heart of the issue.
Let me know if any of that was unclear or if more code is required. Thanks in advance!
Update 2/19/2013:
So after fiddling with the code a bit, I think the error happens in the repeater subroutine. The original literal inside of the repeater works now. For some reason I don't think it worked before but it works fine now. The problem is when we go a step further using a custom control inside of the repeater subroutine. It seems that the information doesn't get passed into the control. The control gets called properly because supporting HTML found only within the control gets outputted properly but the customer information that we try to pass into the control doesn't get inside. Here is the modified code:
search.aspx
<asp:Repeater ID="rptSearchResults" runat="server" OnItemDataBound="rptSearchResults_ItemDataBound">
<ItemTemplate>
<div>
<asp:Literal ID="ltlCustName" runat="server" />
<Acme:CustInfo ID="AcmeCustInfo" runat="server" />
</div>
</ItemTemplate>
</asp:Repeater>
search.aspx.vb
Protected Sub rptSearchResults_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles rptSearchResults.ItemDataBound
Dim item As RepeaterItem = e.Item
Dim strCustName As String = ""
If (item.ItemType = ListItemType.Item) Or (item.ItemType = ListItemType.AlternatingItem) Then
strCustName = e.Item.DataItem("CustName")
' This literal properly shows the customer name on subsequent pages so the customer name reaches this point properly.
Dim ltlCustName As Literal = CType(e.Item.FindControl("ltlCustName"), Literal)
ltlCustName.Text = strCustName
' This control gets called properly but strCustName doesn't
' get passed into the control. The control works fine for the
' first page but subsequent pages do not work. Also, the
' control works fine when PagedDataSource is not used.
Dim AcmeCustInfo As CustInfo = CType(e.Item.FindControl("AcmeCustInfo"), CustInfo)
AcmeCustInfo.CustName = strCustName
End If
End Sub
Per Request from Ann
Here is the code for CustInfo. Needless to say, a lot of the fluff has been stripped out to focus on the issue but if anything is missing that will be useful, please let me know and I'll update the example accordingly.
custinfo.ascx
<%# Control Language="VB" AutoEventWireup="false" CodeFile="CustInfo.ascx.vb" Inherits="CustInfo" %>
<div style="border: 1px solid black;">
<asp:Literal ID="ltlCustName" runat="server" />
</div>
custinfo.ascx.vb
Imports System
Imports System.Web
Imports System.Web.Security
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.Web.UI.HtmlControls
Imports System.Configuration
Imports System.Data
Imports System.Data.SqlClient
Imports System.IO
Imports System.Web.HttpUtility
Partial Class CustInfo
Inherits System.Web.UI.UserControl
Private _CustName As String = ""
Public Property CustName() As String
Get
Return _CustName
End Get
Set(value As String)
_CustName = value
End Set
End Property
Public Sub Page_Load(ByVal Sender As Object, ByVal E As EventArgs) Handles Me.Load
Dim ltlCustName As Literal = CType(FindControl("ltlCustName"), Literal)
ltlCustName.Text = "<b>Name: " & CustName & "</b>"
End Sub
End Class
I'm not a PagedDataSource expert, but I've used user controls extensively.
You're setting the value of the literal in your CustInfo control in the Load subroutine. If I'm not mistaken, that's going to get called when the CustInfo control is created. That would happen before OnItemDataBound is called, so -- I think -- the Load subroutine will happen and the value of the literal be set (to an empty string) before you assign the value of the CustName property. To fix this, try setting the value of the literal later, such as in the PreRender subroutine.
It looks like you're binding on every postback, so the following shouldn't be an issue, but if you aren't, here are some thing that might affect you:
ItemDataBound only runs if you re-bind. If you have ViewState turned on for your repeater, the controls will be recreated on postback, and ItemCreated would run, but ItemDataBound wouldn't. So you'd never re-set your CustName property. And this would matter because ...
... your CustName property has a variable as a backing store: it isn't preserved in ViewState. So when the user control is recreated, the CustName property you previously set won't be there anymore: your literal's contents will be set to the empty string that is the default value of the CustName property.
Those two together would give exactly the behavior you've described. But since it looks like you do bind on every postback (eventually) that may not be the issue. I'm including it for completeness.
I have bound a datapager control to a listview.
I would like to scroll to the first item of the listview control on the DataPager click. I think this should be done with javascript. It seems that the datapager does not allow that.
What options do I have? How can I scroll to a specific anchor when clicking on the DataPager?
you can use the basic html named anchor to scroll to a specific anchor.
You can use the javascript function scrollIntoView for that on client side or on "server side":
http://www.codeproject.com/KB/aspnet/ViewControl.aspx
Thanks Tim!
And for the lazy guys out there (just like me ;), here is the VB.NET equivalent.
It contains typo corrections and the new RegisterClientScriptBlock Method
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
FocusControlOnPageLoad("Label1", Me.Page)
End Sub
Public Sub FocusControlOnPageLoad(ByVal ClientID As String, ByVal page As System.Web.UI.Page)
Dim csName As String = "ScrollViewScript"
Dim csType As Type = Me.GetType
Dim cs As ClientScriptManager = page.ClientScript
If Not cs.IsClientScriptBlockRegistered(csType, csName) Then
Dim csText As New StringBuilder()
csText.Append("<script>function ScrollView(){")
csText.Append("var el = document.getElementById('" & ClientID & "');")
csText.Append("if (el != null){")
csText.Append("el.scrollIntoView();")
csText.Append("el.focus();}}")
csText.Append("window.onload = ScrollView;")
csText.Append("</script>")
cs.RegisterClientScriptBlock(csType, csName, csText.ToString())
End If
End Sub
how can i add a javascript file to the page head from a user control?
Thanks
use Page.RegisterStartupScript("pranay","javascriptFunction()")
put this thing in you load method of user control
check this out :
http://msdn.microsoft.com/en-us/library/system.web.ui.clientscriptmanager.aspx
Are you using master page in your site? If yes then you should do all such includes in the master page. But then also you might face issue with the path of javascript file. You can include the file in following way:
<script type="text/javascript" language="javascript" src="<%= this.ResolveClientUrl("~/Script/jquery.js") %>"></script>
If you want to do it from User Control. Try the following:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
' Define the name, type and url of the client script on the page.
Dim csname As String = "ButtonClickScript"
Dim csurl As String = "~/script_include.js"
Dim cstype As Type = Me.GetType()
' Get a ClientScriptManager reference from the Page class.
Dim cs As ClientScriptManager = Page.ClientScript
' Check to see if the include script is already registered.
If (Not cs.IsClientScriptIncludeRegistered(cstype, csname)) Then
cs.RegisterClientScriptInclude(cstype, csname, ResolveClientUrl(csurl))
End If
End Sub
I have the latest release of the AjaxControlToolkit, and am using an AjaxControlToolkit Html Editor control inside an AjaxControlToolkit ReorderList. I need to be able to access the "content" property so I can write the value to the database but FindControl doesn't find it.
for instance, I can find a TextBox control inside the ItemCommandEvent:
Protected Sub IncludedSectionComponentsReorderList_ItemCommand(ByVal sender As Object, ByVal e As AjaxControlToolkit.ReorderListCommandEventArgs) Handles IncludedSectionComponentsReorderList.ItemCommand
If e.CommandName = "SaveChanges" Then
Dim txtSectionComponentLabel As TextBox = CType(e.Item.FindControl("txtSectionComponentLabel"), TextBox)
End If End Sub
But I can't find an AjaxControlToolkit Html Editor in the same event:
Protected Sub IncludedSectionComponentsReorderList_ItemCommand(ByVal sender As Object, ByVal e As AjaxControlToolkit.ReorderListCommandEventArgs) Handles IncludedSectionComponentsReorderList.ItemCommand
If e.CommandName = "SaveChanges" Then
Dim editor As Editor = CType(e.Item.FindControl("3Editor"), Editor)
strSectionControlValue = editor.Content
End If
End Sub
I haven't used the AjaxControlToolKit ReorderList control before, but you may need to access something like the "_OnItemDataBound" event. Sometimes controls are shoved in there when a row is being databound and you can't access them as you would think.
Good luck and hope this helps some.
Here's a solution for you:
In this example it's taking content from an aspx page to an ascx page
AjaxControlToolkit.HTMLEditor.Editor txtNotes = (AjaxControlToolkit.HTMLEditor.Editor)Page.FindControl("txtNotes");
txtView.Content = txtNotes.Content;