При рендеринге моего частичного представления он не устанавливается как экземпляр объекта

Я пытаюсь использовать частичные представления в первый раз, и мне нужна помощь. Я отправляю строку из Javascript в свой контроллер ASP, чтобы я мог запрашивать свою базу данных, используя эту строку. Вот так:

JavaScript

function findEmployees(userCounty) {
    $.ajax({
        type: "POST",
        url: '@Url.Action("Index", "Contact")',
        data: JSON.stringify(userCounty),
        contentType: "application/json",
        error: function (e) {
            console.info(e)
            console.info("error")
        }
    });
}

Контроллер

    [HttpPost]
    public ActionResult Index([FromBody]string userCounty)
    {
        string county = userCounty.Substring(0, userCounty.IndexOf(" "));
        var query = from SOP in _context.SalesOffice_Plant
                    where SOP.County == county
                    select new SalesOffice_Plant
                    {
                        Employee = SOP.Employee
                    };

        return PartialView(query.ToList());
    }
    [HttpGet]
    public ActionResult Index()
    {
        ViewData["Title"] = "Contact Us";
        ViewBag.Current = "Contact";

        return View();
    }

Когда я устанавливаю точки останова, я вижу, что строка передана правильно, и мой запрос LINQ работает нормально. Моя проблема возникает, когда я хочу отобразить таблицу сотрудников на моей странице индекса. JavaScript возвращает значение контроллеру после загрузки страницы. Это означает, что мне нужен способ «обновить страницу». Мне сказали использовать частичное представление для решения этой проблемы, и это то, что я придумал.

Индекс.cshtml

@model IEnumerable<Project.Models.SalesOffice_Plant>
//A bunch of Html
@await Html.PartialAsync("_IndexPartial")
//More Html

_IndexPartial.cshtml

@model IEnumerable<Project.Models.SalesOffice_Plant>
<table class = "table">
<tbody>
    @foreach (var item in Model)
    {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.Employee)
            </td>
        </tr>
    }
</tbody>

В идеале я хотел бы, чтобы таблица сотрудников была сгенерирована и отображена в Index.cshtml. Однако, когда я загружаю страницу, я получаю сообщение об ошибке, говорящее мне, что мой @await Html.PartialAsync("_IndexPartial") 'не установлен в экземпляр объекта.

Любые указатели в правильном направлении были бы очень полезны.

Отвечает ли это на ваш вопрос? Что такое NullReferenceException и как его исправить?

Ian Kemp 10.12.2020 22:55

Когда присутствует расширение файла, помощник HTML ссылается на частичное представление, которое должно находиться в той же папке, что и файл разметки, вызывающий частичное представление. learn.microsoft.com/en-us/aspnet/core/mvc/views/…

Nonik 10.12.2020 22:56

Я просмотрел этот пост, и я не отвечаю на свой вопрос. Также мои Index.cshtml и _IndexPartial.cshtml находятся в одной и той же папке просмотра под названием «Контакт».

Zap_00 10.12.2020 23:00

действие contollection Index, которое помечено как HttpGet, не передает никакого значения модели в свое представление Index. Index View отображает частичный вид _IndexPartial, который пытается использовать ту же модель. Поскольку модель для Index имеет значение null, то же самое передается частичному представлению, которое вызывает исключение. Вы должны заменить return View(); на return View(new List<SalesOffice_Plant>());

Chetan 11.12.2020 00:00
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
4
528
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Когда вы используете ajax, он не будет перезагружать вашу страницу после завершения кода бэкэнда, поэтому вам нужно использовать метод .html() для вывода результата бэкенда в html.

Вот целая рабочая демонстрация:

Модель:

public class SalesOffice_Plant
{
    public int Id { get; set; }
    public string County { get; set; }
    public string Employee { get; set; }
}

Просмотр (Index.cshtml):

<button type = "button" onclick = "findEmployees('a  ')">Find</button>
<div id = "employee">      
</div>

@section Scripts
{
    <script>
    function findEmployees(userCounty) {
        $.ajax({
            type: "POST",
            url: '@Url.Action("Index", "Contact")',
            data: JSON.stringify(userCounty),
            contentType: "application/json",
            error: function (e) {
                console.info(e)
                console.info("error")
            },
            success: function (res) {
                $("#employee").html(res);    //add this...
            }
        });
    }
    </script>
}

Частичный вид (_IndexPartial.cshtml):

@model IEnumerable<SalesOffice_Plant>
<table class = "table">
    <tbody>
        @foreach (var item in Model)
        {
            <tr>
                <td>
                    @Html.DisplayFor(modelItem => item.Employee)
                </td>
            </tr>
        }
    </tbody>
</table>

Контроллер:

[HttpPost]
public ActionResult Index([FromBody] string userCounty)
{
    string county = userCounty.Substring(0, userCounty.IndexOf(" "));
    var query = from SOP in _context.SalesOffice_Plant
                where SOP.County == county
                select new SalesOffice_Plant
                {
                    Employee = SOP.Employee
                };
    return PartialView("_IndexPartial", query.ToList());  //must specify the partial view name
                                                          //otherwise it will match the action name as partial view name
}
[HttpGet]
public ActionResult Index()
{
    ViewData["Title"] = "Contact Us";
    ViewBag.Current = "Contact";
    return View();
}

Результат:

Другие вопросы по теме