【问题标题】:Event not firing on button click event事件未在按钮单击事件上触发
【发布时间】:2013-05-11 15:59:54
【问题描述】:

这是我以前没有遇到过的问题。

我正在开发一个 MVC4 项目。我正在使用 asp 按钮控件,因为没有可用于按钮的 Html Helper(回复:There's no @Html.Button !)。我的按钮代码是:

<td><asp:Button ID="ButtonUndo" runat="server" Text="Undo" 
                        OnClick="ButtonUndo_Click" AutoPostBack="true"/></td>

我转到设计器选项卡并单击生成事件处理程序的此按钮:

protected void ButtonUndo_Click(object sender, EventArgs e)
{
    RRSPSqlEntities db = new RRSPSqlEntities();
    int id = (int)ViewData["ClientId"];

    var updateAddress = (from a in db.Address
                             where a.PersonId == id
                             select a).SingleOrDefault();

    updateAddress.Deleted = false;
    db.SaveChanges();
}

我应该补充一点,此代码已添加到包含在脚本标记中的同一 .aspx 页面中。本节中还有 Page_Load 方法。事件处理程序不在 Page_Load 中。

问题是在我设置断点并单步执行代码时发现的。单击我的按钮表明它根本没有命中我的事件处理程序。我不知道这是为什么,尤其是当 ASP 通过在设计模式下单击按钮创建事件时。

【问题讨论】:

  • ??你为什么做这个?为什么需要 Button 助手?只是表单中的一个提交按钮,你有一个工作按钮。
  • 你为什么要这样做?让我们从头开始! Asp.Net MVC != Asp.Net WebForms。没有活动!它的基于 HTTP 的框架!看看这里寻求帮助:asp.net/mvc

标签: c# asp.net-mvc


【解决方案1】:

单击我的按钮表明它根本没有触发我的事件处理程序。

这并不奇怪。 ASP.NET MVC 使用完全不同的事件模型(即它没有像 Web 表单那样的事件模型)。但是,您要尝试做的事情非常简单。在你的控制器中构建一个新方法,我们称之为Undo

public ActionResult Undo(int id)
{
    RRSPSqlEntities db = new RRSPSqlEntities();

    var updateAddress = (from a in db.Address
                             where a.PersonId == id
                             select a).SingleOrDefault();

    updateAddress.Deleted = false;
    db.SaveChanges();

    return View("{insert the original action name here}");
}

然后在您的标记中,像这样简单地标记input

<form method="POST" action="/ControllerName/Undo">
    @Html.HiddenFor(Model.Id)
    <input type="submit" value="Undo" />
</form>

您所在的ViewModel 包含一个属性,我将其命名为Id,即您想要传递给Undoid

【讨论】:

  • 谢谢。显然我不知道 MVC 的基础知识。
  • 没问题,这是一种非常不同的思维方式。我真的很高兴能为您提供帮助!
【解决方案2】:

我通常更喜欢进行 ajax 调用。你可以试试:

    <button type="button" class="button" onclick="ButtonUndo();" />

形式:

    <script>
        function ButtonUndo() {
            $.ajax({
                    type: 'POST',
                    url: '/controller/action',
                    data: 'PersonID=' + ID,
                    dataType: 'json',
                    cache: false,
                    success: function (result) {
                        //do stuff here
                    },
                    error: function () {
                        //do error stuff here
                    }
            });
        }
    </script>

控制器:

    [HttpPost]
    public ActionResult Action(int PersonID)
    {
        //Do your stuff here

        return new JsonResult { result = "something" };
    }

(抱歉有任何拼写错误或语法错误...我从我们在项目中使用的现有代码中提取。)

【讨论】: