Asp.net mvc 删除视图正在将空对象返回给控制器

Asp.net mvc 删除视图正在将空对象返回给控制器,asp.net-mvc,Asp.net Mvc,我是ASP.NET MVC新手,我正在尝试开发一个简单的应用程序来实现CRUD操作,但是当返回到控制器时,Delete操作遇到了一个奇怪的问题,因为它返回一个null对象,不允许操作完成。我将在下面展示模型、控制器及其各自视图的代码 型号: public class Biblioteca { public int IdBiblioteca { get; set; } public string Nome { get; set; } public string Endere

我是ASP.NET MVC新手,我正在尝试开发一个简单的应用程序来实现CRUD操作,但是当返回到控制器时,Delete操作遇到了一个奇怪的问题,因为它返回一个null对象,不允许操作完成。我将在下面展示模型、控制器及其各自视图的代码

型号:

public class Biblioteca
{
    public int IdBiblioteca { get; set; }
    public string Nome { get; set; }
    public string Endereco { get; set; }
}
控制器

public class BibliotecaController : Controller
{
    ADAO dao = DAOFactory.GetInstance(DAOFactory.DAOType.Biblioteca);

    [HttpGet]
    public ActionResult DeleteLibrary(int id)
    {
        return View(dao.Select(id));
    }

    [HttpPost]
    public ActionResult DeleteLibrary(Biblioteca b)
    {
        dao.Delete(b);
        return RedirectToAction("Index");
    }
}
查看删除库

@model BibliotecaWebApp.Models.Biblioteca

<h2>DeleteLibrary</h2>
<h3>Are you sure you want to delete this?</h3>
<div>
    <h4>Biblioteca</h4>
    <hr />
    <dl class="dl-horizontal">
        <dt>@Html.DisplayNameFor(model => model.IdBiblioteca)</dt>
        <dd>@Html.DisplayFor(model => model.IdBiblioteca)</dd>
        <dt>@Html.DisplayNameFor(model => model.Nome)</dt>
        <dd>@Html.DisplayFor(model => model.Nome)</dd>
        <dt>@Html.DisplayNameFor(model => model.Endereco)</dt>
        <dd>@Html.DisplayFor(model => model.Endereco)</dd>
    </dl>

    @using (Html.BeginForm()) {
        @Html.AntiForgeryToken()
        <div class="form-actions no-color">
            <input type="submit" value="Delete" class="btn btn-default" /> |
            @Html.ActionLink("Back to List", "Index")
        </div>
    }
</div>
@model BibliotecaWebApp.Models.Biblioteca
删除库
是否确实要删除此项?
藏书馆

@DisplayNameFor(model=>model.idbibioTeca) @DisplayFor(model=>model.idbibioTeca) @DisplayNameFor(model=>model.Nome) @DisplayFor(model=>model.Nome) @DisplayNameFor(model=>model.Endereco) @DisplayFor(model=>model.Endereco) @使用(Html.BeginForm()){ @Html.AntiForgeryToken() | @ActionLink(“返回列表”、“索引”) }
正如我们在控制器代码段中看到的,每个操作都有两个控制器:一个[HttpGet],它检索要在确认视图中显示的数据,然后才能删除该数据[HttpPost]。当[HttpPost]DeleteLibrary从视图中获取一个空的Biblioteca对象以执行排除时,问题就会出现。下面有两个屏幕截图更好地展示了这一点:

[HttpGet]DeleteLibrary工作正常:

但当用户单击Delete按钮时,[HttpPost]DeleteLibrary方法上会收到一个空对象,如下所示:

我的问题是:当返回的对象被传递到视图时,为什么它会变为null?有什么问题吗?

用这个

***使用(Html.BeginForm()){
@Html.AntiForgeryToken()
@Html.HiddenFor(m=>m.IdBiblioteca)
|
@ActionLink(“返回列表”、“索引”)

}**
因为您没有为您的模型生成任何表单控件,所以没有任何可回发的内容。但无论如何,您应该只回发
ID
属性。表单只回发其控件的值(
input
select
textarea
)。您没有控件,因此没有要提交的内容(您也不应该提交)。只需将POST方法的签名更改为
[HttpPost](public ActionResult delete library(int-id)
,谢谢您的回答,但这种方法将创建两个具有相同签名的方法,[HttpGet]和[HttpPost]。我不明白的是,其他CRUD方法是这样工作的。没有其他方法可以解决此问题吗?谢谢。如果您将POST方法的签名更改为
[HttpPost](public ActionResult DeleteLibrary(int id)
并单击submit按钮,则方法中的
id
值将是发送到视图的
IDBIBIBILOTECA
的值(假设您使用默认路由)。您的
dao.Delete()
应该只接受一个
id
(而不是
Biblioteca
),但如果您确实希望使用这种方法(并降低性能),则需要调用数据库并再次获取
Biblioteca
(就像在get方法中所做的那样),另一个选项是为模型中的每个属性添加隐藏输入-
@Html.HiddenFor(m=>m.idbibibiloteca)
etc,但这只会降低性能并使您面临过度发布攻击。虽然此代码块可能会回答此问题,但最好您能对其原因提供一点解释。也许您可以描述这两个代码块的不同之处以及这些更改修复问题的原因。因为缓存本地机器中的问题一些数据似乎没有正确绑定。但是,当我们在表单提交中发布一个值时,它会工作