按钮点击事件未触发的问题

3

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

我正在开发一个MVC4项目。由于没有可以用于按钮的Html Helper(参见:There's no @Html.Button !),所以我使用了asp按钮控件。我的按钮代码如下:

<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页面中,并用script标签进行了包装。此部分还包括Page_Load方法。事件处理程序不在Page_Load内。
当我设置断点并逐步执行代码时,发现了问题。点击我的按钮后,它根本没有命中我的事件处理程序。我不知道为什么会出现这种情况,特别是因为ASP是从Design模式中点击按钮创建事件的。

为什么要这样做?你为什么需要按钮助手?只需在表单中放置提交按钮,就可以拥有一个可用的按钮。 - Mike Cole
你为什么要这样做?让我们从初学者开始!Asp.Net MVC != Asp.Net WebForms。没有事件!它是基于HTTP的框架!在这里查看帮助:http://www.asp.net/mvc - Fals
2个回答

5
点击我的按钮后,发现它根本没有触发我的事件处理程序。这并不令人惊讶。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>

如果你所在的 View 对应的 Model 包含一个属性(我称之为 Id),该属性值为传递给 Undo 方法的 id


谢谢。显然我不了解MVC的基础知识。 - user2284341
没问题,这是一种非常不同的思考方式。我很高兴能够提供帮助! - Mike Perrenoud

0

我通常更喜欢使用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" };
    }

(对于任何拼写错误或语法错误,我表示抱歉...我从我们项目中使用的现有代码中提取了这些内容。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接