Я пытаюсь использовать частичные представления в первый раз, и мне нужна помощь. Я отправляю строку из 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") 'не установлен в экземпляр объекта.
Любые указатели в правильном направлении были бы очень полезны.
Когда присутствует расширение файла, помощник HTML ссылается на частичное представление, которое должно находиться в той же папке, что и файл разметки, вызывающий частичное представление. learn.microsoft.com/en-us/aspnet/core/mvc/views/…
Я просмотрел этот пост, и я не отвечаю на свой вопрос. Также мои Index.cshtml и _IndexPartial.cshtml находятся в одной и той же папке просмотра под названием «Контакт».
действие contollection Index
, которое помечено как HttpGet
, не передает никакого значения модели в свое представление Index
. Index
View отображает частичный вид _IndexPartial
, который пытается использовать ту же модель. Поскольку модель для Index
имеет значение null, то же самое передается частичному представлению, которое вызывает исключение. Вы должны заменить return View();
на return View(new List<SalesOffice_Plant>());
Когда вы используете 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();
}
Результат:
Отвечает ли это на ваш вопрос? Что такое NullReferenceException и как его исправить?