Я пытаюсь использовать @Html.RenderAction
для отображения Create View в Index View, чтобы он отображался на одной странице.Ошибка System.Web.Mvc.HttpHandlerUtil + ServerExecuteHttpHandlerAsyncWrapper on @ Html.RenderAction после отправки данных
Пользователь вводит имя, фамилию и т. Д. И нажимает кнопку «Создать», чтобы отправить данные, а затем новую таблицу добавляется в таблицу ниже, перезагружая представление индекса (без AJAX).
Когда я нажал на кнопку Создать, чтобы добавить новую запись, я получил следующее сообщение об ошибке:
Error executing child request for handler 'System.Web.Mvc.HttpHandlerUtil+ServerExecuteHttpHandlerAsyncWrapper'.
на @{ Html.RenderAction("Create"); }
сценарий после того, как запись будет добавлена в базу данных и перенаправлять Index View.
Что я здесь делаю неправильно? Можно ли таким образом использовать RenderAction
? Как ни странно, когда я нажал кнопку «Создать», он сначала попал в действие «Индекс», а затем «Создать» («Опубликовать»), почему бы прямо не попасть в действие (сообщение)?
Вот код:
Индекс Вид:
@model IEnumerable<MailMerge.ViewModels.EmployeeIndexViewModel>
@{
ViewBag.Title = "Home Page";
}
@{ Html.RenderAction("Create"); }
<h2>List</h2>
<table class="table">
<thead>
<tr>
<th>@Html.DisplayNameFor(m => m.FirstName)</th>
<th>@Html.DisplayNameFor(m => m.LastName)</th>
<th>@Html.DisplayNameFor(m => m.Address)</th>
</tr>
</thead>
<tbody>
@foreach (var item in Model)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.FirstName)
</td>
<td>
@Html.DisplayFor(modelItem => item.LastName)
</td>
<td>
@Html.DisplayFor(modelItem => item.Address)
</td>
</tr>
}
</tbody>
</table>
Создать вид:
@model MailMerge.ViewModels.EmployeeCreateViewModel
@{
ViewBag.Title = "Create";
}
<h2>Create</h2>
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
<div class="form-group">
@Html.LabelFor(model => model.FirstName, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.FirstName)
@Html.ValidationMessageFor(model => model.FirstName)
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.LastName, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.LastName)
@Html.ValidationMessageFor(model => model.LastName)
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Address, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Address)
@Html.ValidationMessageFor(model => model.Address)
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Create" class="btn btn-primary" />
</div>
</div>
</div>
}
Контроллер:
public class HomeController : Controller
{
TestEntities db = new TestEntities();
public ActionResult Index()
{
var employees = db.Employees.ToList();
List<EmployeeIndexViewModel> employeesVM = new List<EmployeeIndexViewModel>();
foreach (Employee employee in employees)
{
employeesVM.Add(new EmployeeIndexViewModel
{
ID = employee.ID,
FirstName = employee.FirstName,
LastName = employee.LastName,
Address = employee.Address
});
}
return View(employeesVM);
}
public ActionResult Create()
{
EmployeeCreateViewModel employeeVM = new EmployeeCreateViewModel();
return PartialView("_Create", employeeVM);
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(EmployeeCreateViewModel employeeVM)
{
if (ModelState.IsValid)
{
Employee employee = new Employee();
employee.FirstName = employeeVM.FirstName;
employee.LastName = employeeVM.LastName;
employee.Address = employeeVM.Address;
db.Employees.Add(employee);
db.SaveChanges();
return RedirectToAction("Index");
}
return PartialView("_Create", employeeVM);
}
}
Что произойдет, если вы поставите точку останова в своем действии контроллера? –
@PatrickHofman Нет проблем в действии контроллера, это происходит при просмотре индексов после отправки данных. – Willy
. Вы можете проверить, передав действие и параметр контроллера из Html.Beginform ie @using (Html.BeginForm («Создать», «Главная»)) –