Попытка привязать данные с сервера SQL с помощью веб-метода C# (ASP. NET) к сетке, закодированной с использованием jQuery - PullRequest
1 голос
/ 09 мая 2020

Надеюсь, заголовок моего вопроса информативен и поможет вам понять проблему, с которой я столкнулся. Я новичок в программировании и знаю, что проблема, с которой я столкнулся, может возникнуть только у новичка. Пожалуйста, помогите мне. Пожалуйста, подождите, это довольно длинное описание. Я знаю, что большинство из вас, которые являются частью этого сообщества, являются очень опытными программистами и не нуждаются в такой подробной методологии, но я не собираюсь тратить ваше время, и я считаю, что, дав такое подробное описание, вы бы сможет помочь мне лучше. Теперь о проблеме: я пытаюсь построить сетку, используя jQuery:

https://www.jqwidgets.com/jquery-widgets-demo/demos/jqxgrid/index.htm#demos / jqxgrid / defaultfunctionality.htm

Я использовал исходный код из приведенной выше ссылки, чтобы построить сетку, но когда я запускаю программу, данные не отображаются. Я уверен, что проблема заключается в jQuery, потому что я запускал свою веб-службу отдельно, и она подключается к SQL серверу и отображает результат в виде массива JSON.

У меня есть разбил решение на три проекта в Visual Studio 2019:

  1. Проект PracticeValidation - содержит 3 веб-формы .aspx c#. Один для домашней страницы, другой для формы рецепта и третий для формы сотрудника.
  2. Проект WebServicesFunctionality - содержит один файл .asmx Webservice, который содержит 2 веб-метода (один для формы рецепта, другой для формы сотрудника) для сериализации данных, поступающих в виде списка, в JSON массив. Ниже приведен код веб-службы.
[System.Web.Script.Services.ScriptService]
    public class WebService1 : System.Web.Services.WebService
    {

        [WebMethod]
        public string GetRecipe()
        {
            JavaScriptSerializer js = new JavaScriptSerializer();
            string recipeList = String.Empty;
            List<FormGeneratorClass.FormGeneratorVar.RecipeVar> recipeCatcher = new List<FormGeneratorClass.FormGeneratorVar.RecipeVar>();
            recipeCatcher = FormGeneratorClass.FormGeneratorVar.ExecuteRecipeList();
            if (recipeCatcher != null && recipeCatcher.Count > 0)
            {
                recipeList = js.Serialize(recipeCatcher);
            }
            else
                recipeList = js.Serialize("No recipes!");
            return recipeList;
        }

        [WebMethod]
        public string GetEmp()
        {
            JavaScriptSerializer js = new JavaScriptSerializer();
            string EmployeeList = String.Empty;
            List<FormGeneratorClass.FormGeneratorVar.EmpVar> employeeCatcher = new List<FormGeneratorClass.FormGeneratorVar.EmpVar>();
            employeeCatcher = FormGeneratorClass.FormGeneratorVar.ExecuteEmployeeList();
            if (employeeCatcher != null && employeeCatcher.Count > 0)
            {
                EmployeeList = js.Serialize(employeeCatcher);
            }
            else
                EmployeeList = js.Serialize("No recipes!");
            return EmployeeList;
        }
    }
Проект FormGeneratorClass: Этот проект содержит файл класса c#, который отвечает за взаимодействие с SQL Сервером. Я прикрепляю код внутри этого файла ниже.
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace FormGeneratorClass
{
    public class FormGeneratorVar
    {
        public class RecipeVar
        {
            public int Recipe_Id { get; set; }
            public string Recipe_Name { get; set; }
        }

        public class EmpVar
        {
            public int Emp_Id { get; set; }
            public string Emp_FirstName { get; set; }
            public string Emp_LastName { get; set; }
        }

        public static List<RecipeVar> ExecuteRecipeList()
        {
            List<RecipeVar> listRecipe = new List<RecipeVar>();
            string strConnString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
            using (SqlConnection con = new SqlConnection(strConnString))
            {
                string sqlSelectAllQuery = "SELECT * FROM Tbl_Recipe";
                SqlCommand cmd = new SqlCommand(sqlSelectAllQuery, con);
                con.Open();
                SqlDataReader rdr = cmd.ExecuteReader();
                while (rdr.Read())
                {
                    RecipeVar recipe = new RecipeVar();
                    recipe.Recipe_Id = !(rdr["recipe_id"] == DBNull.Value) ? Convert.ToInt32(rdr["recipe_id"]) : 0;
                    recipe.Recipe_Name = !(rdr["recipe_name"] == DBNull.Value) ? Convert.ToString(rdr["recipe_name"]) : string.Empty;
                    listRecipe.Add(recipe);
                }
                con.Close();
            }
            return listRecipe;
        }

        public static List<EmpVar> ExecuteEmployeeList()
        {
            List<EmpVar> listEmployee = new List<EmpVar>();
            string strConnString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
            using (SqlConnection con = new SqlConnection(strConnString))
            {
                string sqlSelectAllQuery = "SELECT * FROM Tbl_Emp";
                SqlCommand cmd = new SqlCommand(sqlSelectAllQuery, con);
                con.Open();
                SqlDataReader rdr = cmd.ExecuteReader();
                while (rdr.Read())
                {
                    EmpVar employee = new EmpVar();
                    employee.Emp_Id = !(rdr["emp_id"] == DBNull.Value) ? Convert.ToInt32(rdr["emp_id"]) : 0;
                    employee.Emp_FirstName = !(rdr["emp_firstName"] == DBNull.Value) ? Convert.ToString(rdr["emp_firstName"]) : string.Empty;
                    employee.Emp_LastName = !(rdr["emp_lastName"] == DBNull.Value) ? Convert.ToString(rdr["emp_lastName"]) : string.Empty;
                    listEmployee.Add(employee);
                }
                con.Close();
            }
            return listEmployee;
        }
    }
}

Я установлю проект WebServicesFunctionality (pt.2) в качестве запускаемого проекта и сделаю снимок экрана с результатом, который я получаю для вашей справки

  1. Веб-служба загружена в моем локальном браузере

  2. Результат после вызова веб-метода сотрудника

  3. Результат после вызова веб-метода рецепта

Теперь я уверен, что все, кто читает этот пост, будут иметь более четкое представление о том, что я пытаюсь сделать. Итак, теперь я прикреплю код для страницы .aspx сотрудника.

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="EmployeeRecord.aspx.cs" Inherits="PracticeValidation.WebForm2" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Record of employees</title>
    <meta name="description" content="JavaScript Grid with rich support for Data Filtering, Paging, Editing, Sorting and Grouping" />
    <link href="Scripts/jqx.base.css" rel="stylesheet" type="text/css"/>
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
    <meta name="viewport" content="width=device-width, initial-scale=1 maximum-scale=1 minimum-scale=1" />
    <script src="Scripts/jquery-1.11.1.min.js"></script>
    <script src="Scripts/jqxcore.js"></script>
    <script src="Scripts/jqxdata.js"></script>
    <script src="Scripts/jqxbuttons.js"></script>
    <script src="Scripts/jqxscrollbar.js"></script>
    <script src="Scripts/Menu.js"></script>
    <script src="Scripts/jqxcheckbox.js"></script>
    <script src="Scripts/jqxlistbox.js"></script>
    <script src="Scripts/jqxdropdownlist.js"></script>
    <script src="Scripts/jqxgrid.js"></script>
    <script src="Scripts/jqxgrid.sort.js"></script>
    <script src="Scripts/jqxgrid.pager.js"></script>
    <script src="Scripts/jqxgrid.selection.js"></script>
    <script src="Scripts/jqxgrid.edit.js"></script>
    <script src="Scripts/demos.js"></script>
    <script type="text/javascript">
            $(document).ready(function () {
                //Getting the source data with ajax GET request
                source = {
                    datatype: "json",
                    datafields: [
                        { name: 'EmpID' },
                        { name: 'EmpLastName' },
                        { name: 'EmpFirstName' }
                    ],
                    async: false,
                    record: 'Table',
                    url: 'WebService1.asmx/GetEmp',

                };
                var dataAdapter = new $.jqx.dataAdapter(source,
                    { contentType: 'application/json; charset=utf-8' }
                );
                $("#grid").jqxGrid({
                    source: dataAdapter,
                    theme: 'classic',
                    width: '100%',

                    columns: [
                        { text: 'EmpID', dataField: 'EmpID', width: 250, hidden: false },
                        { text: 'EmpLastName', dataField: 'EmpLastName', width: 150 },
                        { text: 'EmpFirstName', dataField: 'EmpFirstName', width: 180 },
                    ]
                });
            });
    </script>
</head>
<body class ='default'>
    <form id="form1" runat="server">
        <div>
            <h1>Welcome to the record of employees page</h1>
            <h4>Click <a href="HomePage.aspx">here</a> to go back to the main login page</h4>
        </div>
        <div id="grid">
        </div>
    </form>
</body>
</html>

Наконец, я прикреплю снимок экрана с полученным результатом.

Вывод страницы записи сотрудника .aspx : enter image description here

Спасибо всем, кто прочитал весь пост, и будьте в безопасности!

1 Ответ

0 голосов
/ 30 августа 2020

Я понял, где я ошибся. Было много причин, по которым данные не привязывались к сетке так, как я хотел. Я надеюсь, что это будет полезно для всех, у кого возникнет такая же проблема. данные из веб-службы. Это связано с тем, что проект веб-службы и проект веб-формы выполняются на другом порту. Таким образом, даже если все в порядке, вы получите ошибку 404 при выполнении запроса AJAX. Так что создайте прокси-сервер веб-службы из проекта веб-формы или просто откажитесь от идеи создания отдельного проекта веб-службы.

Следующая проблема, с которой я столкнулся, была непростой, и мне потребовалось очень много времени, чтобы понять . Независимо от сериализации данных, поступающих из SQL в JSON, данные, которые фактически отправляются обратно из веб-службы, - это XML. Это связано с тем, что веб-службы используют SOAP и, следовательно, по умолчанию используется метод передачи данных XML. Если вы запустите веб-службу и посмотрите на данные, вы увидите строку JSON с оболочкой XML. Если вы откроете инструменты Chrome dev и посмотрите на тип содержимого, вы увидите, что он возвращает XML, и независимо от того, что вы делаете, вы не можете помешать веб-сервису возвращать XML через AJAX 'GET ' запрос. Итак, как решить проблему? Два способа:

Метод 1. Используйте веб-API вместо веб-службы. Это позволит вам использовать службы REST.

Метод 2: Если вы категорически против использования веб-службы, следующая ссылка будет очень полезной. https://www.one-tab.com/page/IjhbYbayRlWka-8ruNI87w

После того, как я получил AJAX, возвращающий JSON из веб-службы. Следующая проблема заключалась в привязке данных к сетевому плагину. Это довольно просто и понятно. Найдите демонстрацию метода, который вы хотите использовать, и скопируйте и вставьте все в функцию успешного обратного вызова запроса AJAX. Вы даже можете передать данные, которые вы получаете, вызвав определяемую пользователем функцию ВНУТРИ функции успешного обратного вызова запроса AJAX.

Иногда вы можете столкнуться с проблемой при использовании веб-службы с использованием AJAX запрос, в котором говорится, что «произошла ошибка во время сериализации или десериализации. Превышено максимальное JSON свойство length». Если вы столкнулись с этим, попробуйте инициализировать объект javascriptSerializer значением maxInt.

Если вы используете Newtonsoft. JSON, проверьте, сериализованы ли ваши данные с помощью обычного класса javascriptSerializer. Причина, по которой я говорю это, заключается в том, что AJAX запрашивает сериализацию данных с использованием javascriptSerializer и Newtonsoft. JSON имеет тенденцию игнорировать ошибки циклической ссылки. В результате функция Ajax может выдать ошибку «Произошла ошибка во время сериализации или десериализации. Превышено максимальное свойство JSON length», когда на самом деле ваша веб-служба работает с ошибкой циклической ссылки. Если это так, подумайте о внесении изменений в SP или запрос, который вы используете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...