Entity framework 重定向到[HttpPost]返回时的操作;“未找到资源”;错误

Entity framework 重定向到[HttpPost]返回时的操作;“未找到资源”;错误,entity-framework,asp.net-mvc-4,ninject,Entity Framework,Asp.net Mvc 4,Ninject,我有一个相当简单的项目,它使用ninject和asp mvc 4以及实体框架。 我添加了一个基于视图的编辑和创建ActionResult,没有任何问题。但是,删除操作结果不起作用。 该视图是一个基于实体的IEnumerable,带有一个简单的ActionLink @Html.ActionLink("Delete", "Delete_Client", new { item.ClientId }) 控制器也很简单 [HttpPost] public ActionResult Delete

我有一个相当简单的项目,它使用ninject和asp mvc 4以及实体框架。 我添加了一个基于视图的编辑和创建ActionResult,没有任何问题。但是,删除操作结果不起作用。

该视图是一个基于实体的IEnumerable,带有一个简单的ActionLink

@Html.ActionLink("Delete", "Delete_Client", new { item.ClientId }) 
控制器也很简单

[HttpPost]
    public ActionResult Delete_Client(int id)
    {
        Client deleteClient = repository.DeleteClient(id);

        if (deleteClient != null)
        {
            TempData["message"] = string.Format("{0} was deleted.", deleteClient.Name);
        }

        return RedirectToAction("Admin_Client_List");
    }
它通过界面与模型交互

 Client DeleteClient(int id);
在实体框架中

 public Client DeleteClient(int id)
    {
        Client dbEntry = context.Clients.Find(id);
        if (dbEntry != null)
        {
            context.Clients.Remove(dbEntry);
            context.SaveChanges();
        }
        return dbEntry;
    }
错误是

找不到资源。

这是非常令人困惑的,因为我觉得我不理解框架的一个非常基本的原则。据我所知,这意味着客户端控制器没有相应的ActionResult。但是有。本教程建议删除操作应该是幂等的,因此只包含[HttpPost]

Uri如下所示

/Client/Delete_Client?ClientId=12
/Client/Delete_Client/12
我想也许应该是这样

/Client/Delete_Client?ClientId=12
/Client/Delete_Client/12
然而,这是行不通的


更新了管理客户列表的请求。cshtml

@model IEnumerable<Project.Domain.Entities.Client>

@{
    ViewBag.Title = "Client List";
    ViewBag.Icon = "entypo-layout";
    ViewBag.ClientActive = "active";
    Layout = "~/Views/Shared/_AdminLayout.cshtml";
}

<a href="@Url.Action("Create_Client","Client")" class="btn btn-primary">Create a new Client</a>
<div class="row">
    @foreach (var item in Model)
    {
        <div class="col-sm-3">

            <div class="tile-progress tile-blue">

                <div class="tile-header">
                    <a href="@Url.Action("Client_Details", "Client", new { id =item.ClientId})">
                        <h3>@item.Name <i class="entypo-right-open-big"></i> <span class="badge badge-secondary pull-right">7</span></h3>
                    </a>
                </div>

                <div class="tile-progressbar">
                    <span data-fill="78%" style="width: 78%;"></span>
                </div>

                <div class="tile-footer">
                    <h4>
                        <span class="pct-counter">78</span>% increase
                    </h4>

                    <span>@item.Description</span>

                </div>

                <div class="tile-header">
                    <a href="@Url.Action("Edit_Client", "Client", new { id = item.ClientId})" type="button" class="btn btn-blue btn-icon icon-left">
                        <i class="entypo-pencil"></i> Edit
                    </a>

                    @*<a href="javascript:$('#modal-6').modal('show', {backdrop: 'statuc'});" class="btn btn-default">Show Me</a>*@

                    @Html.ActionLink("Delete", "Delete_Client", new { id = item.ClientId }) 

                    @*<a href="@Url.Action("Delete_Client", "Client", new { item.ClientId })" class="btn btn-red btn-icon pull-right">Delete <i class="entypo-cancel"></i></a>*@
                </div>
            </div>

        </div>
    }
</div>
@model IEnumerable
@{
ViewBag.Title=“客户列表”;
ViewBag.Icon=“entypo布局”;
ViewBag.ClientActive=“活动”;
Layout=“~/Views/Shared/_AdminLayout.cshtml”;
}
@foreach(模型中的var项目)
{
增长78%
@项目.说明
@**@
@ActionLink(“Delete”,“Delete_Client”,new{id=item.ClientId})
@**@
}

使用以下代码:

@Html.ActionLink("Delete", "Delete_Client", new { id = item.ClientId }) 


[HttpPost]
public ActionResult Delete_Client(int id)
{
    Client deleteClient = repository.DeleteClient(id);

    if (deleteClient != null)
    {
        TempData["message"] = string.Format("{0} was deleted.", deleteClient.Name);
    }

    return RedirectToAction("Admin_Client_List");
}
更改代码

@Html.ActionLink("Delete", "Delete_Client", new { item.ClientId }) 

试一试

@Html.ActionLink("Delete", "Delete_Client", null, new { id = item.ClientId })

您必须删除[HttpPost],这是一个GET请求

您的操作方法在同一个控制器中吗?嘿,Reddy。是的。以及编辑和创建。它们都在ClientController中。我想这可能就是问题所在,我不知道这是否与路由引擎有关。它目前是默认值。这真的很奇怪,因为创建/编辑和工作查找,这只是删除。谢谢Bappi Datta。看看那个代码,它应该能工作。uri是Client/Admin\u Client\u List/{id},应该可以使用。请给出Admin\u Client\u List的代码。如果是这样的:Admin\u Client\u List(intid),那么您可以使用这个:return RedirectToAction(“Admin\u Client\u List”,new{id=id});如果希望Client/Admin\u Client\u List/{id}工作,则需要在
重定向到操作
上传递值。类似于
returnredirectoaction(“Admin\u Client\u List”,new{id=id})目前我没有使用VS,所以不要介意输入错误。不,这不起作用。我认为这与ninject或EF有关。。我想我在模特身上做错了什么。我更新了控制器并删除了[HttpPost]过滤器。它与变化一起工作。我不想掉进兔子洞,但你知道为什么没有[HttpPost]它还能工作吗?谢谢你的法律。谢谢,这确实有效。在本教程中,他们建议这个ActionResult应该有过滤器[HttpPost]此操作方法应仅支持POST请求,因为删除对象不是幂等操作。正如我们将在第14章中解释的那样,浏览器和缓存可以在未经用户明确同意的情况下自由发出GET请求,因此我们必须小心避免由于GET请求而进行更改。“。您知道为什么这会与过滤器一起工作吗?。谢谢