2015-08-03 5 views
0

Я пытаюсь использовать @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); 
    } 
} 
+0

Что произойдет, если вы поставите точку останова в своем действии контроллера? –

+0

@PatrickHofman Нет проблем в действии контроллера, это происходит при просмотре индексов после отправки данных. – Willy

+1

. Вы можете проверить, передав действие и параметр контроллера из Html.Beginform ie @using (Html.BeginForm («Создать», «Главная»)) –

ответ

1

Несмотря на то, что вы отправляете его с частичного просмотра, он находится внутри индексного вида и под его маршрутом. Если вы хотите публиковать сообщения в другом виде, вам нужно установить действие формы для публикации в этом представлении в submit.

<form method="post" action="@Url.Action("Create", "Home")" > 
+0

Вы правы, я не знаю об этом, спасибо. – Willy

1

Вы можете добавить действие и параметр контроллера в вашем Html.BeginForm()

@using(Html.BeginForm("Create", "Home")) 
    { 
     @Html.AntiForgeryToken() 

     <div class="form-horizontal"> 
     .... 
     </div> 

    } 

 Смежные вопросы

  • Нет связанных вопросов^_^