在javascript更新后,从web用户控件获取codebehind中的asp:TextBox文本属性
Getting asp:TextBox text property in codebehind from a web user control after a javascript update
这是一个场景。
我有一个包含asp:PlaceHolder的简单页面。
<%@ Page Title="" Language="VB" MasterPageFile="~/MasterPage.master" AutoEventWireup="false" CodeFile="TrainingPlan.aspx.vb" Inherits="TrainingPlan" %>
<%@ Reference Control="ctlTask.ascx" %>
<%@ Reference Control="ctlTaskheader.ascx" %>
<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" Runat="Server">
<div class="centered">
<h2><asp:Label ID="lblPlanTitle" runat="server" Text="Plan Title"></asp:Label></h2>
<hr />
<br />
<asp:ImageButton ID="imgbtnSave" runat="server" ImageUrl="~/Images/save.ico" />
<br />
<asp:PlaceHolder ID="PlanPlaceHolder" runat="server"></asp:PlaceHolder>
</div>
</asp:Content>
此页面上的占位符由同一web用户控件的几行填充。此web用户控件包含多个文本框。对于这个web用户控件中的每个文本框,我都有公共属性来设置和获取文本值。在web用户控件的页面加载事件中,我将向其中一些文本框添加onClick属性
Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
txtTrainingStart.Attributes.Add("onClick", "txtTrainingStart_Click(" & txtTrainingStart.ClientID & ", " & txtTask.ClientID & ");")
txtTraineeBadgeNum.Attributes.Add("onClick", "txtTraineeBadgeNum_Click(" & txtTraineeBadgeNum.ClientID & ", " & txtTask.ClientID & ", " & txtTrainingStart.ClientID & ");")
txtTrainerBadgeNum.Attributes.Add("onClick", "txtTrainerBadgeNum_Click(" & txtTrainerBadgeNum.ClientID & ", " & txtTrainingComplete.ClientID & ", " & txtTask.ClientID & ", " & txtTraineeBadgeNum.ClientID & ", " & Session.Item("isTrainer").ToString.ToLower & ");")
txtDecertifyingOfficial.Attributes.Add("onClick", "txtDecertifyingOfficial_Click(" & txtDecertifyingOfficial.ClientID & ", " & txtTrainerBadgeNum.ClientID & ", " & txtTask.ClientID & ", " & Session.Item("isDecertifyingOfficial").ToString.ToLower & ");")
End Sub
对于每一个onClick事件,我都有相应的javascript函数。
<script type="text/javascript">
function txtTrainingStart_Click(txtTrainingStart, txtTask) {
//processing and updates to textboxes here
}
</script>
问题来了。
在包含占位符的主页上,我有一个保存按钮。在保存按钮的单击事件中,我循环浏览占位符中包含的每个web用户控件,以处理和保存数据。
Protected Sub imgbtnSave_Click(sender As Object, e As ImageClickEventArgs) Handles imgbtnSave.Click
For Each item As Control In PlanPlaceHolder.Controls
Dim task As ctlTask = TryCast(item, ctlTask)
If Not IsNothing(task) Then
'need updated textbox values here.
'The following line gets the original textbox value, not the updated value that I need
Dim test As String = task.trainingStart
End If
Next
End Sub
我所尝试的一切都只能得到页面加载时文本框中的原始值。我认为这应该很简单,我只是错过了一些基本的东西。我在谷歌上到处搜索这个解决方案,但我还没有找到。这是我发现的最接近的东西->Javascript PROPER方式中asp:label的Set Text属性。尽管这篇文章处理的是标签而不是文本框,并且没有使用包含几个web用户控件的占位符。据我所知,我需要将更新从客户端POST回服务器,但我不知道如何做到这一点。我尝试过使用Request.Form
属性,但似乎无法实现。我错过了什么?
谢谢你的帮助,Rylan
编辑
以下是根据请求用web用户控件填充占位符的代码
Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
Dim DBConn As MySqlConnection
Dim cmd As New MySqlCommand
DBConn = New MySqlConnection(Globals.mysqlConStr)
Try
lblPlanTitle.Text = Request.QueryString("plan_name") & " Training Plan"
If Session.Item("empID") = -1 Then
empID = clsUser.getID
Else
empID = Session.Item("empID")
End If
Dim strSQL As String = "SELECT * FROM task_revs tr WHERE tr.change != 'Deleted' and tr.id_plan = " & Request.QueryString("id_plan") & " ORDER BY task_num, rev_date desc"
Dim da As New MySqlDataAdapter(strSQL, DBConn)
Dim dtAllRevs As New DataTable
da.Fill(dtAllRevs)
Dim dtCurrentRev As New DataTable
Dim lastTaskNum As String = ""
dtCurrentRev = dtAllRevs.Clone
For Each row As DataRow In dtAllRevs.Rows
If lastTaskNum <> row("task_num") Then
dtCurrentRev.ImportRow(row)
lastTaskNum = row("task_num")
End If
Next
strSQL = "SELECT * FROM checkoffs WHERE emp_id = " & empID
da = New MySqlDataAdapter(strSQL, DBConn)
Dim dtCheckoffs As New DataTable
da.Fill(dtCheckoffs)
Dim addColor As Boolean = True
Dim tabWidth As Integer
Dim Header As ctlTaskHeader = LoadControl("ctlTaskHeader.ascx")
PlanPlaceHolder.Controls.Add(Header)
For Each row As DataRow In dtCurrentRev.Rows
Dim newRow As ctlTask = LoadControl("ctlTask.ascx")
tabWidth = 0
newRow.id_Task = row("id_Task")
newRow.taskNum = row("task_num")
newRow.task = row("task")
If row("is_header") = True Then
If row("task_num").ToString.EndsWith(".0") And row("task_num").ToString.Split(".").Count = 2 Then
newRow.taskBold = True
newRow.taskItalic = True
Else
newRow.taskForeColor = Drawing.Color.Blue
newRow.taskItalic = True
tabWidth += 10
End If
Else
tabWidth += 10
End If
For i As Integer = 0 To row("task_num").ToString.Split(".").Count - 3
tabWidth += 10
Next
newRow.TabSize = tabWidth
If Not IsDBNull(row("task_level")) Then
For i As Integer = 0 To row("task_level") - 1
newRow.taskLevel = newRow.taskLevel & "*"
Next
End If
If addColor = True Then
newRow.taskNumBackColor = Drawing.Color.LightGray
newRow.taskLevelBackColor = Drawing.Color.LightGray
newRow.taskBackColor = Drawing.Color.LightGray
newRow.trainingStartBackColor = Drawing.Color.LightGray
newRow.trainingCompleteBackColor = Drawing.Color.LightGray
newRow.traineeBadgeNumBackColor = Drawing.Color.LightGray
newRow.trainerBadgeNumBackColor = Drawing.Color.LightGray
newRow.decertifyingOfficialBackColor = Drawing.Color.LightGray
End If
addColor = Not addColor
For Each checkoff As DataRow In dtCheckoffs.Rows
If checkoff("id_task") = row("id_task") Then
If Not IsDBNull(checkoff("training_start")) Then
newRow.trainingStart = checkoff("training_start")
End If
If Not IsDBNull(checkoff("training_complete")) Then
newRow.trainingComplete = checkoff("training_complete")
End If
If Not IsDBNull(checkoff("trainee_badge")) Then
newRow.traineeBadgeNum = checkoff("trainee_badge")
End If
If Not IsDBNull(checkoff("trainer_badge")) Then
newRow.trainerBadgeNum = checkoff("trainer_badge")
End If
If Not IsDBNull(checkoff("decertifying_official")) Then
newRow.decertifyingOfficial = checkoff("decertifying_official")
newRow.taskNumBackColor = Drawing.Color.LightSalmon
newRow.taskLevelBackColor = Drawing.Color.LightSalmon
newRow.taskBackColor = Drawing.Color.LightSalmon
newRow.trainingStartBackColor = Drawing.Color.LightSalmon
newRow.trainingCompleteBackColor = Drawing.Color.LightSalmon
newRow.traineeBadgeNumBackColor = Drawing.Color.LightSalmon
newRow.trainerBadgeNumBackColor = Drawing.Color.LightSalmon
newRow.decertifyingOfficialBackColor = Drawing.Color.LightSalmon
End If
End If
Next
If row("is_header") = True And PlanPlaceHolder.Controls.Count > 1 Then
Dim newLine As LiteralControl = New LiteralControl("<br/>")
PlanPlaceHolder.Controls.Add(newLine)
End If
PlanPlaceHolder.Controls.Add(newRow)
Next
Catch ex As Exception
clsLog.logError(ex)
Finally
DBConn.Close()
End Try
编辑2
我认为展示我如何更新javascript函数中的文本框可能也很重要
function txtTrainingStart_Click(txtTrainingStart, txtTask) {
var currentdate = new Date();
var datetime = (currentdate.getMonth() + 1) + "/" + currentdate.getDate() + "/" + currentdate.getFullYear() + " " + getTimeAMPM();
txtTrainingStart.value = datetime;
txtTrainingStart.style.backgroundColor = "yellow";
}
编辑3:
以下代码将适用于静态控件,但动态创建的控件将不会在回发时保留。您需要存储更新后的值,以便在回发时以某种方式检索它们(例如会话变量或HiddenField)。如果可能的话,我会静态地创建控件,并将它们填充到page_load
中,隐藏没有数据的控件——这将允许您在回发时获得如下值。
嗯。。。我为您的代码设置了一个超级简化版本,并按原样运行(没有数据库功能),它似乎运行得很好。
这是我使用的简化版本:
<asp:Content id="Content1" ContentPlaceHolderID="MainContent" runat="server">
<asp:ImageButton ID="imgbtnSave" runat="server"></asp:ImageButton>
<asp:PlaceHolder ID="PlanPlaceHolder" runat="server">
<asp:TextBox runat="server" ID="txtTrainingStart" value="before" ></asp:TextBox>
</asp:PlaceHolder>
</asp:Content>
Javascript:
function txtTrainingStart_Click(txtTrainingStart, txtTask) {
var currentdate = new Date();
var test = "after";
txtTrainingStart.value = test;
txtTrainingStart.style.backgroundColor = "yellow";
}
VB:
Protected Sub imgbtnSave_Click(ByVal sender As Object, ByVal e As ImageClickEventArgs Handles imgbtnSave.Click
For Each item As TextBox In PlanPlaceHolder.Controls
'need updated textbox values here.'
Debug.WriteLine(item.ID)
Debug.WriteLine(item.Text)
Next
End Sub
我正在获取文本框的更新值,因此您应该能够将该值传递给函数,并执行所需的任何操作。
如果我遗漏了什么,请告诉我。
编辑2:我刚才有个想法——点击保存按钮后,你能检查一下是否调用了page_load
吗?我想知道它是否会再次用原始值覆盖更新后的值。
如果是的话,我会用回发检查来包装page_load
中的数据库功能:
If Not IsPostBack
' connect to database'
' populate placeholder'
End If
我已经想通了。我使用Request.Form
是正确的,我只是还不完全理解如何使用它。
我的保存按钮的新代码
Protected Sub imgbtnSave_Click(sender As Object, e As ImageClickEventArgs) Handles imgbtnSave.Click
Dim coll As NameValueCollection
coll = Request.Form
For x = 0 To coll.Count - 1
Response.Write("Key = " & coll.GetKey(x) & " Value = " & coll(x) & "<br />")
Next
End Sub
循环从回发中输出所有的控制键和更新的值,就像这样。
Key = ctl00$MainContent$ctl01$txtTrainingStart Value = 8/1/13
Key = ctl00$MainContent$ctl01$txtTrainingComplete Value = 8/2/13
Key = ctl00$MainContent$ctl02$txtTrainingStart Value = 8/3/13
Key = ctl00$MainContent$ctl02$txtTrainingComplete Value = 8/4/13
我使用一个隐藏字段来存储每个动态创建的web用户控件的数据库行id。从那时起,很容易将更新后的值插入到我的数据库中。
- 将值从Javascript传递并返回到VBScript,ASP中的Vice Versa
- ASP中的动态图像.NET Web应用程序
- ASP中的JavaScript在IE中的表现与FireFox不同
- 从经典 ASP 中的 SQL 数据集为高图表创建多个数组
- 在 asp 中的按钮单击上上传文件
- 使用 Javascript 从经典 ASP 中的文件中读取文本
- 移动请求检测并重定向到 ASP 中的移动页面(活动服务器页面)
- Javascript选中经典asp中的所有复选框
- 简单Aurelia ASP中的Javascript错误.Net 5.0 RC1设置
- 如何在asp中的自定义弹出窗口(通过html数据属性)中的dropdownlist中添加默认项(--Select--)剑
- jQueryMobile在ASP中的应用净WebForm
- ASP中的TDD/BDD JavaScript.NET MVC支持多种浏览器引擎
- ASP中的Toast通知.Net MVC 4
- jQuery在ASP中的应用.网络用户控件
- ASP中的模型绑定数组.净MVC
- ASP中的滑动(或移动)控件.. NET与javascript
- ASP中的全局客户端验证.. NET Web表单使用CustomValidation.ClientValidationF
- ASP中的客户端验证.. NET MVC项目没有验证规则
- 删除javascript/asp中的XML换行符
- 使用Asp中的c#数组在javascript中创建数组