2017-01-03 11 views
0

В этом проекте MVC5 я хочу, чтобы страница сведений также отображалась как страница «Редактировать» и «Удалить».MVC 5 Удалить действие в деталях Страница

Я решаю эту задачу, создав 2 формы, причем все необходимое для обновления данных, включая кнопку отправки.

@using (Html.BeginForm()) 
{ 
    @Html.AntiForgeryToken() 

    @Html.HiddenFor(model => model.EmpresaID) 
    ... 
    <input type="submit" class="btn btn-primary" value="Submeter" /> 
} 

Теперь, для моей второй формы, я поясню есть кнопка Удалить:

@using (Html.BeginForm()) 
{ 
    @Html.AntiForgeryToken() 
    @Html.HiddenFor(model => model.EmpresaID) 
    <input type="submit" class="btn btn-danger" value="Delete" /> 
} 

Ошибка:

The parameters dictionary contains a null entry for parameter 'id' of non-nullable type 'System.Int32' for method 'System.Threading.Tasks.Task`1[System.Web.Mvc.ActionResult] DeleteConfirmed(Int32)'

Я пытался использовать ActionLink, но затем я получаю HTTP 404. Что странно, поскольку меня направляют в правильное место назначения:

@Html.ActionLink("Delete", "Delete", new { id = Model.EmpresaID }) 

Посылает

.../Empresa/Delete/6 

EDIT1

Действие Метод:

// POST: Empresa/Delete/5 
     [HttpPost, ActionName("Delete")] 
     [ValidateAntiForgeryToken] 
     public async Task<ActionResult> DeleteConfirmed(int id) 
     { 
      Empresa empresa = await db.Empresas.FindAsync(id); 
      db.Empresas.Remove(empresa); 
      await db.SaveChangesAsync(); 
      return RedirectToAction("Index"); 
     } 

EDIT2

Действие Метод

// POST: Empresa/Delete/5 
[HttpPost] 
[ValidateAntiForgeryToken] 
public async Task<ActionResult> Delete([Bind(Include = "EmpresaID,Nome,Estado,Severidade,Inicio,Fim")] Empresa empresa) 
{ 
    //Do something with the posted viewModel 
    Empresa e = await db.Empresas.FindAsync(empresa.EmpresaID); 

    db.Empresas.Remove(e); 

    return RedirectToAction("Index"); 
} 

Details.cshtml:

@using (Html.BeginForm("Delete", "Empresa", FormMethod.Post)) 
{ 
    @Html.AntiForgeryToken() 
    @Html.HiddenFor(model => model.EmpresaID) 
    @Html.ActionLink("Delete", "Delete", new { id = Model.EmpresaID }) 
    <button type="submit" class="btn btn-danger" value="Delete">Delete</button> 
} 

ActionLink не показывает никаких ошибок, но ничего не удалять либо.

Кнопка дает мне HTTP 404. Что я здесь делаю неправильно?

EDIT3

// POST: Empresa/Delete/5 
    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public async Task<ActionResult> Delete([Bind(Include = "EmpresaID,Nome,Estado,Severidade,Inicio,Fim")] Empresa empresa) 
    { 
     //Do something with the posted viewModel 
     Empresa e = await db.Empresas.FindAsync(empresa.EmpresaID); 

     db.Empresas.Remove(e); 
     await db.SaveChangesAsync(); 
     return RedirectToAction("Index"); 
    } 

Единственная проблема с EDIT2 было то, что я забыл, чтобы сохранить изменения.

Теперь он работает правильно.

+1

Пожалуйста, покажите код для метода действий. – buffjape

+0

см. Обновленный вопрос @buffjape – Lernas

+0

Является ли ошибка 404 до или после опубликованной формы? Вам также необходимо сохранить изменения в базе данных так: 'db.SaveChanges()' после строки 'db.Empresas (e)'. Плюс, что такое 'e' в этом контексте? – Gareth

ответ

2

Вам необходимо указать форму, действие которой необходимо заполнить вместе с FormMethod i.e. GET или POST. Поэтому для удаления действия, например, что-то вроде этого:

@model MyProject.SomeViewModel 

@using (Html.BeginForm("Delete", "Empresa", FormMethod.Post)) 
{ 
    @Html.AntiForgeryToken() 
    @Html.HiddenFor(model => model.EmpresaId) 

    <button type="submit" class="btn btn-danger" value="Delete">Delete</button> 
} 

И тогда в вашем контроллере что-то вроде:

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Delete(SomeViewModel viewModel) 
    { 
     //Do something with the posted viewModel 

     return RedirectToAction("Index"); 
    } 
+0

спасибо за ваш вход @Gareth, поэтому я адаптировал свой код, но все еще не могу удалить. – Lernas

+0

Теперь он работает, мне нужно было сохранить изменения. Подождите db.SaveChangesAsync(); – Lernas