【问题标题】:Delete view is returning null object to controller删除视图正在将空对象返回给控制器
【发布时间】:2015-09-23 10:01:48
【问题描述】:

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

型号:

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>

正如我们在控制器 sn-p 中看到的,每个操作有两个控制器:一个 [HttpGet] 检索要在确认视图中显示的数据,然后可以删除相同的数据 [HttpPost]。问题出现在 [HttpPost]DeleteLibrary 中,一旦它从视图中获取 null Biblioteca 对象以执行排除。下面有两个屏幕截图可以更好地呈现这一点:

[HttpGet] DeleteLibrary 正常工作:

但是当用户点击Delete按钮时,在[HttpPost]DeleteLibrary方法上接收到一个空对象,如下图:

我的问题是:为什么返回的对象在传递给视图时会变为空?可能是什么问题?

【问题讨论】:

  • 因为你没有为你的模型生成任何表单控件,所以没有什么可以发回的。但无论如何,您应该只发回 ID 属性。
  • 表单只回发其控件的值(inputselecttextarea)。您没有控制权,因此无需提交任何内容(也不应该提交)。只需将 POST 方法的签名更改为 [HttpPost](public ActionResult DeleteLibrary(int id)
  • 感谢您的回答,但是这种方法将创建两个具有相同签名的方法,[HttpGet] 和 [HttpPost]。我无法理解的是其他 CRUD 方法是这样工作的。没有另一种方法吗?谢谢。
  • 如果您将 POST 方法的签名更改为[HttpPost](public ActionResult DeleteLibrary(int id) 并单击提交按钮,则方法中id 的值将是您发送到视图的IdBiblioteca 的值(假设您使用默认路由)。你的dao.Delete()应该真的只接受ID(不是Biblioteca),但如果你真的想要这种方法(并降低性能),那么你需要调用数据库并再次获取Biblioteca(只是就像你在 GET 方法中所做的那样)
  • 另一种选择是为模型中的每个属性添加隐藏输入 - @Html.HiddenFor(m =&gt; m.IdBiblioteca) 等在表单标签内,但这只会降低性能并让您面临过度发布攻击

标签: asp.net-mvc


【解决方案1】:

使用这个

**@using (Html.BeginForm()) {
        @Html.AntiForgeryToken()
        @Html.HiddenFor(m => m.IdBiblioteca)
        <div class="form-actions no-color">
            <input type="submit" value="Delete" class="btn btn-default" /> |
            @Html.ActionLink("Back to List", "Index")
        </div>
    }**

而不是这个

**@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>
    }**

【讨论】:

  • 虽然这个代码块可能会回答这个问题,但最好能稍微解释一下它为什么这样做。也许您可以描述这两个块的不同之处以及为什么这些更改可以解决问题。
  • 由于本地机器的缓存问题,一些数据似乎没有正确绑定。但是,当我们故意在表单提交中发布一个值时,它会起作用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-30
相关资源
最近更新 更多