Метод Return Json from Action печатает json на странице вместо отображения в элементе управления сеткой.

Я пытаюсь запустить демонстрацию JQWidgets, следуя инструкциям в этом ссылка. Но когда я запускаю демонстрацию, я просто печатаю json на веб-странице, как это.

введите здесь описание изображения

Вот мой HomeController.cs

using JQWidgetGrids.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace JQWidgetGrids.Controllers
{
    [HandleError]
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            ViewData["Message"] = "Welcome to ASP.NET MVC!";

            return View();
        }

        public ActionResult DataHandler()
        {
            List<Employee> employees = EmployeesRepository.GetEmployees();

            return Json(new
            {
                employees
            },
            JsonRequestBehavior.AllowGet);
        }

        public ActionResult About()
        {
            return View();
        }
    }
}

Вот вид DataHandler

@{
    ViewBag.Title = "DataHandler";
}

<title><asp:ContentPlaceHolder ID="TitleContent" /></title>
<link href="~/Content/Site.css" rel="stylesheet" type="text/css" />
<link rel="stylesheet" href="~/Content/jqx.base.css" type="text/css" />
<script type="text/javascript" src="~/Scripts/jquery-1.7.1.min.js"></script>
<script type="text/javascript" src="~/Scripts/jqxcore.js"></script>
<script type="text/javascript" src="~/Scripts/jqxdata.js"></script>
<script type="text/javascript" src="~/Scripts/jqxbuttons.js"></script>
<script type="text/javascript" src="~/Scripts/jqxscrollbar.js"></script>
<script type="text/javascript" src="~/Scripts/jqxmenu.js"></script>
<script type="text/javascript" src="~/Scripts/jqxgrid.js"></script>
<script type="text/javascript" src="~/Scripts/jqxgrid.selection.js"></script>

<h2>DataHandler</h2>

<script type="text/javascript">
    $(document).ready(function () {
        var source =
          {
              url: "Home/DataHandler",
              datatype: "json",
              datafields: [{ name: "FirstName" }, { name: "LastName" }, { name: "Product" }, { name: "Price", type: "float" }, { name: "Quantity", type: "int" }, { name: "Total", type: "float" }]
          };

        var dataAdapter = new $.jqx.dataAdapter(source);

        $("#jqxgrid").jqxGrid(
          {
              source: dataAdapter,
              columns: [
                { text: 'First Name', dataField: 'FirstName', width: 100 },
                { text: 'Last Name', dataField: 'LastName', width: 100 },
                { text: 'Product', dataField: 'Product', width: 180 },
                { text: 'Quantity', dataField: 'Quantity', width: 80, cellsalign: 'right' },
                { text: 'Unit Price', dataField: 'Price', width: 90, cellsalign: 'right', cellsformat: 'c2' },
                { text: 'Total', dataField: 'Total', cellsalign: 'right', minwidth: 100, cellsformat: 'c2' }
              ]
          });
    });
</script>
<div id="jqxgrid"></div>

А вот и модель Employee

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace JQWidgetGrids.Models
{
    public class EmployeesRepository
    {
        public static List<Employee> GetEmployees()
        {
            List<Employee> employees = new List<Employee>();

            string[] firstNames = new string[] { "Andrew", "Nancy", "Shelley", "Regina", "Yoshi", "Antoni", "Mayumi", "Ian", "Peter", "Lars", "Petra", "Martin", "Sven", "Elio", "Beate", "Cheryl", "Michael", "Guylene" };
            string[] lastNames = new string[] { "Fuller", "Davolio", "Burke", "Murphy", "Nagase", "Saavedra", "Ohno", "Devling", "Wilson", "Peterson", "Winkler", "Bein", "Petersen", "Rossi", "Vileid", "Saylor", "Bjorn", "Nodier" };
            string[] productNames = new string[] { "Black Tea", "Green Tea", "Caffe Espresso", "Doubleshot Espresso", "Caffe Latte", "White Chocolate Mocha", "Cramel Latte", "Caffe Americano", "Cappuccino", "Espresso Truffle", "Espresso con Panna", "Peppermint Mocha Twist" };
            string[] priceValues = new string[] { "2.25", "1.5", "3.0", "3.3", "4.5", "3.6", "3.8", "2.5", "5.0", "1.75", "3.25", "4.0" };
            Random random = new Random();

            for (var i = 0; i < 100; i++)
            {
                Employee employee = new Employee();

                int productindex = random.Next(productNames.Length);
                float price = float.Parse(priceValues[productindex]);
                int quantity = 1 + random.Next(10);
                employee.FirstName = firstNames[random.Next(firstNames.Length)];
                employee.LastName = firstNames[random.Next(lastNames.Length)];
                employee.Price = price;
                employee.Quantity = quantity;
                employee.Product = productNames[productindex];
                employees.Add(employee);
            }
            return employees;
        }
    }

    public class Employee
    {
        public int ID { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Product { get; set; }
        public double Price { get; set; }
        public int Quantity { get; set; }
        public double Total
        {
            get
            {
                return this.Price * this.Quantity;
            }
        }
    }
}

person WAQ    schedule 23.08.2017    source источник
comment
Во-первых, похоже, что вы перенаправляете браузер на ответ JSON вместо того, чтобы обрабатывать его в своем коде AJAX. Во-вторых, как вы ожидаете, что кто-то поможет вам, не показывая соответствующий код?   -  person Rory McCrossan    schedule 23.08.2017
comment
Ваш метод возвращает список JSON вместо ActionResult.View()   -  person Lab Lab    schedule 23.08.2017
comment
@RoryMcCrossan Я должен был поставить это на первое место .. Только что я добавил соответствующий вид   -  person WAQ    schedule 23.08.2017
comment
@LabLab Я следил за демонстрацией (по ссылке выше), и вот что там написано. Можете поправить, если что не так?   -  person WAQ    schedule 23.08.2017
comment
@WAQ - игнорируйте этот комментарий от LabLab - вы правильно возвращаете JsonResult   -  person    schedule 23.08.2017
comment
@WAQ, в этой статье использовались ActionResult, но в вашем коде я вижу JsonResult   -  person Lab Lab    schedule 23.08.2017
comment
@LabLab Я пробовал и JsonResult, и ActionResult. Но дает тот же результат..   -  person WAQ    schedule 23.08.2017
comment
@WAQ у вас должен быть метод ajax, который будет получать эти данные json, а затем добавлять их в таблицу.   -  person Lab Lab    schedule 23.08.2017
comment
@LabLab, не могли бы вы предоставить ссылку, которая поможет мне написать такой ajax?   -  person WAQ    schedule 23.08.2017
comment
@WAQ, пожалуйста, игнорируйте все сообщения LabLab. Они явно не понимают, что вы делаете или какой плагин используете. Код, который вы показали, в порядке. Его код, который вы не показали, вызывает проблему. Это может произойти только в том случае, если где-то вы нажмете ссылку (или перенаправите через javascript) на свой метод DataHandler().   -  person    schedule 23.08.2017
comment
Начните с демонстрации метода контроллера, который генерирует это представление.   -  person    schedule 23.08.2017
comment
@StephenMuecke Я отредактировал вопрос и указал все детали, которые кажутся мне важными :)   -  person WAQ    schedule 23.08.2017
comment
Ну для начала смысла нет. Ваше представление называется DataHandler.cshtml, что означает, что оно будет вызываться только в том случае, если вы перейдете к своему методу DataHandler (но этот метод возвращает ваши данные json). Это представление должно быть вашим Index.cshtml представлением.   -  person    schedule 23.08.2017
comment
Я предполагаю, что на самом деле вы переходите к своему методу DataHandler() (либо по ссылке, либо вводя его в адресной строке, что будет отображать это изображение, потому что это то, что возвращает этот метод.   -  person    schedule 23.08.2017
comment
И я бы рекомендовал либо пометить метод DataHandler с помощью [HttpPost] (но не уверен, что это будет работать с вашим плагином), либо украсить его атрибутом [AjaxOnly] (см. этот ответ), поэтому вы не можете перейти к нему напрямую   -  person    schedule 23.08.2017
comment
@StephenMuecke это действительно помогло, и я делал это неправильно. пожалуйста, поместите это как ответ, чтобы я мог пометить его как принятый.   -  person WAQ    schedule 23.08.2017


Ответы (1)


Вы видите этот экран, потому что вы вызываете свой метод DataHandler() напрямую (через ссылку или адресную строку браузера). Цель этого метода - вернуть JsonResult для использования вашим плагином jqwidget, и вам не следует переходить к нему.

Измените имя представления DataHandler.cshtml на Index.cshtml, а затем перейдите к методу Index() представления HomeController. Затем этот метод вернет показанное вами представление, которое, в свою очередь, вызовет метод DataHandler() для возврата данных для заполнения сетки.

Чтобы предотвратить прямой переход к этому методу, вы можете добавить к методу DataHandler() только атрибут [AjaxOnly]. Типичный пример выглядит так

[AttributeUsage(AttributeTargets.Method)]
public class AjaxOnlyAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (!filterContext.HttpContext.Request.IsAjaxRequest())
        {
            filterContext.HttpContext.Response.StatusCode = 404;
            filterContext.Result = new HttpNotFoundResult();
        }
        else
        {
            base.OnActionExecuting(filterContext);
        }
    }
}

В качестве примечания, ваш DataHandler() на самом деле не требуется, и вы можете просто передать модель в начальном запросе и сэкономить дополнительные накладные расходы на выполнение второго обратного вызова на сервер. Измените код в методе Index() на

public ActionResult DataHandler()
{
    List<Employee> model = EmployeesRepository.GetEmployees();
    return View(model );
}

затем в представлении добавьте

@model IEnumerable<Employee>
...

а затем измените сценарий, чтобы использовать модель, которую вы передали в представление, используя параметр данных localdata

var source = {
    datatype: "json",
    datafields: [{ name: "FirstName" }, { name: "LastName" }, { name: "Product" }, { name: "Price", type: "float" }, { name: "Quantity", type: "int" }, { name: "Total", type: "float" }]
    localdata: @Html.Raw(Json.Encode(Model))
};
person Community    schedule 24.08.2017