ASP.NET JQuery 无法访问服务器和 HTML 控件

Posted

技术标签:

【中文标题】ASP.NET JQuery 无法访问服务器和 HTML 控件【英文标题】:ASP.NET JQuery unable to access Server and HTML Controls 【发布时间】:2020-07-22 11:33:46 【问题描述】:

我在将 javascript 集成到 ASP.NET 时遇到问题。我想使用 jQuery 甚至 Vanilla JavaScript 来执行一些客户端操作,但我无法访问 html 和 ASP.NET 服务器控件。我尝试了很多解决方案,就像使用 <%= element.ClientID %> 但没有一个对我有用。我无法识别我的错误,请帮助我识别。

已经尝试过

    RegisterClientScriptBlock 直接包含 JavaScript 文件 $("#<% element.ClientID %>") document.getElementById("<%= element.ClientID %>"); 使用 HTML 控件代替服务器,反之亦然。

new_quiz.aspx

<%@ Page Title="" Language="C#" MasterPageFile="~/teacher_quizes/teacher_quizes.master" AutoEventWireup="true" CodeBehind="new_quiz.aspx.cs" Inherits="onlineQuiz_bsef17m35.teacher_quizes.new_quiz" %>
<asp:Content ID="Content1" ContentPlaceHolderID="quizes" runat="server">
  <div class="form p-2">
    <div class="form-group p-1">
      <asp:Label runat="server" Text="Quiz Title"></asp:Label><br />
      <small class="text-danger">The title of your quiz</small>
      <input runat="server" type="text" maxlength="64" id="title"
        class="form-control"/>
      <asp:RequiredFieldValidator runat="server" ControlToValidate="title"
        ErrorMessage="Title is required"></asp:RequiredFieldValidator>
    </div>

    <div class="form-group p-1">
      <asp:Label runat="server" Text="Quiz Description"></asp:Label><br />
      <small class="text-danger">Please describe this quiz</small>
      <textarea runat="server" id="description" class="form-control" rows="2"
        maxlength="128">
      </textarea>
      <asp:RequiredFieldValidator runat="server" ControlToValidate="description"
        ErrorMessage="Description is required" CssClass="text-warning text-muted">
      </asp:RequiredFieldValidator>
    </div>

    <div class="form-group p-1">
      <asp:Label runat="server" Text="Maximum Marks"></asp:Label><br />
      <small class="text-danger">The maximum achiveable marks for this quiz, between 1 and 1000</small>
      <input runat="server" type="number" min="1" max="100" id="maxMarks"
        class="form-control"/>
      <asp:RangeValidator MinimumValue="1" MaximumValue="1000"
        runat="server" ControlToValidate="maxMarks" CssClass="text-warning"
        ErrorMessage="Please choose a number between 1 and 100">
      </asp:RangeValidator>
    </div>

    <div class="form-group p-1">
      <asp:Label runat="server" Text="Passing Marks"></asp:Label><br />
      <small class="text-danger">The passing marks for this quiz, between 1 and 1000 and lesser than or equal to total marks</small>
      <input runat="server" type="number" min="1" max="100" id="passingMarks"
        class="form-control"/>
      <asp:RangeValidator MinimumValue="1" MaximumValue="1000"
        runat="server" ControlToValidate="passingMarks" CssClass="text-warning"
        ErrorMessage="Please choose a number between 1 and 100">
      </asp:RangeValidator>
    </div>

    <div class="form-group p-1 card mb-2">
      <div><b runat="server" id="questions">Quesions</b></div>
      <div class="form-group">
        <asp:Label runat="server" Text="Question"></asp:Label><br />
        <asp:TextBox runat="server" ID="question" CssClass="form-control"/>

        <asp:Label runat="server" Text="Type of Question"></asp:Label><br />
        <select runat="server" id="questionType" class="form-control"
          onchange="questionTypeChange()"></select>

        <div runat="server" id="questionOptions">
          <small>Please check checkbox in front of Options to denote an option as true</small>

          <div class="form-group">
            <asp:Label runat="server" Text="Option 1"></asp:Label><br />
            <input runat="server" type="text" maxlength="64" id="questionOption1"
              class="form-control" />
            <input runat="server" type="checkbox" id="questionOption1Validity" 
              class="input-group-append"/>
            <asp:RequiredFieldValidator runat="server" ControlToValidate="questionOption1"
              ErrorMessage="Option 1 is required!" CssClass="text-danger">
            </asp:RequiredFieldValidator>
          </div>

          <div class="form-group">
            <asp:Label runat="server" Text="Option 1"></asp:Label><br />
            <input runat="server" type="text" maxlength="64" id="questionOption2"
              class="form-control" />
            <input runat="server" type="checkbox" id="questionOption2Validity" 
              class="input-group-append"/>
            <asp:RequiredFieldValidator runat="server" ControlToValidate="questionOption2"
              ErrorMessage="Option 2 is required!" CssClass="text-danger">
            </asp:RequiredFieldValidator>
          </div>
          <div class="d-flex flex-row-reverse">
            <button class="btn btn-sm btn-primary">Add another Option</button>
          </div>
        </div>
      </div>
    </div>
  </div>
</asp:Content>

new_quiz.aspx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;

namespace onlineQuiz_bsef17m35.teacher_quizes

  public partial class new_quiz : System.Web.UI.Page
  
    protected void Page_Load(object sender, EventArgs e)
    
      if (IsPostBack)
      
        return;
      

      DatabaseEntities db = new DatabaseEntities();
      var quizes = db.getQuestionTypes().ToArray();
      questionType.DataSource = quizes;
      questionType.DataBind();

      if (questionType.Value == "Multiple Choice")
      
        questionOptions.Visible = true;
       else
      
        questionOptions.Visible = false;
      


      /* register client scripts */
      Type scriptType = this.GetType();
      String scriptName = "script";
      String scriptUrl = "./new_quiz.js";
      String scriptText = File.ReadAllText(Server.MapPath(scriptUrl));
      ClientScriptManager scriptManager = Page.ClientScript;
      if (!scriptManager.IsClientScriptBlockRegistered(scriptType, scriptName))
      
        scriptManager.RegisterClientScriptBlock(scriptType, scriptName, scriptText, true);
      
    
  

new_quiz.js

function questionTypeChange() 
  const element = document.getElementById("<%= question.ClientID %>");
  console.log(element);

【问题讨论】:

【参考方案1】:

首先检查您的 jQuery 是否正确加载。 打开控制台(按 F12)并输入“jQuery”并输入 - 你应该得到一些东西。如果你得到“未定义” - 然后确保你加载它。

然后,您应该能够通过 jQuery 选择器访问您的 HTML。

更多信息在这里:https://www.w3schools.com/jquery

【讨论】:

jQuery 已正确加载。我可以使用jQuery$,这些都在那里。 $("button") 肯定会在页面中显示按钮。 如果它加载了,那么你应该使用 jQuery 选择器来操作你的元素。 w3schools.com/jquery/jquery_selectors.asp JS 只能使用 *.asp 的最终结果。 JS 和 jQuery 对 asp 代码一无所知,因为 asp 运行在后端(如 php)。【参考方案2】:

真正的问题是我使用的是外部脚本。外部脚本中的 ASP.NET 标记不起作用。为此,我使用jQuery 模式匹配来查找控件。

要查找带有ID="saveButton" 的按钮,我使用了$("[id$=saveButton]"),这会导致所有控件的ID 都以saveButton 结尾。

上述方法可行,因为 ASP.NET 将原始 ID 附加到编译时生成的一些随机 ID,所以最终的 html id 总是以标记中给出的原始 id 结尾。

【讨论】:

以上是关于ASP.NET JQuery 无法访问服务器和 HTML 控件的主要内容,如果未能解决你的问题,请参考以下文章

使用 JQuery 访问 ASP.net Web 服务时出错 - JSONP

无法从 jQuery 使用 ASP.NET Web 服务

ASP.NET MVC+EF在服务端分页使用jqGrid以及jquery Datatables的注意事项

从 JQuery 访问文本框

找不到或无法访问 Asp.net SQL 服务器实例

使用 jQuery jsonp 跨域调用到 ASP.NET Web 服务