user2284341
user2284341

Reputation: 671

Event not firing on button click event

This is a problem I haven't come across before.

I'm working on an MVC4 project. I'm using an asp button control because there isn't a Html Helper that can be used for a button (re: There's no @Html.Button !). My button code is:

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

I went to the Designer tab and clicked on this button which produced the event handler:

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();
}

I should add that this code was added to the same .aspx page wrapped in a script tag. Also within this section is the Page_Load method. The eventhandler is not within Page_Load.

The problem was found when I set a breakpoint and stepped through the code. Clicking my button shows that it doesn't hit my event handler at all. I don't know why this is, particularly as ASP created the event from clicking the button in Design mode.

Upvotes: 3

Views: 3500

Answers (2)

Amit M
Amit M

Reputation: 61

I usually prefer to make ajax calls. You can try:

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

In the form:

    <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>

Controller:

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

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

(Sorry for any typos or syntax errors...I pulled from existing code that we use in a project.)

Upvotes: 0

Mike Perrenoud
Mike Perrenoud

Reputation: 67898

Clicking my button shows that it doesn't hit my event handler at all.

This isn't all that surprising. ASP.NET MVC uses a completely different event model (i.e. it doesn't have one like web forms). However, what you're trying to do is very straight forward. In your controller build a new method, let's call it 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}");
}

and then in your markup, simply markup the input like this:

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

where the Model for the View you're on contains a property, I've called it Id, that is the id you want passed into Undo.

Upvotes: 5

Related Questions