John
John

Reputation: 575

Click a button, call a method in controller in ASP.NET

I want to do something very simple, which is to create an HTML button that calls a controller function when clicked, the same as this HTML actionlink. This should really be remarkably easy. The action link is:

@Html.ActionLink("Submit", "Submit", "Home")

I'm using the Razer viewmodel and .NET 4.5. I've done some research, and it seems that I may have to create my own custom button. I'm fine with that, but is that really necessary? See: Mvc Html.ActionButton. It would seem like an oversight for this to have no native microsoft support, but if not, I can live with that.

Please forgive the naivety of this question - I'm new to ASP.NET, though not to C# or web development. Thanks!

Upvotes: 0

Views: 958

Answers (1)

Bob
Bob

Reputation: 66

I grabbed this from somewhere. but you can map view actions to controller actions with the following code.

Create a class with the following code.

[AttributeUsage(AttributeTargets.Method, AllowMultiple=false, Inherited=true)]
    public class MultipleButtonAttribute : ActionNameSelectorAttribute
    {
        public string Name { get; set; }
        public string Argument { get; set; }

        public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo)
        {
            var isValidName = false;
            var keyValue = string.Format("{0}:{1}", Name, Argument);
            var value = controllerContext.Controller.ValueProvider.GetValue(keyValue);

            if (value != null)
            {
                controllerContext.Controller.ControllerContext.RouteData.Values[Name] = Argument;
                isValidName = true;
            }

            return isValidName;
        }
    }

In your View code you can have the following submit buttons

<input type="submit" value="Action A" name="action:ActionA" /> 
<input type="submit" value="Action B" name="action:ActionB" />

And your controller contains the following code.

[HttpPost]
    [MultipleButton(Name="action", Argument="ActionA")]
    public ActionResult MyActionA(myModel model)
    {
        ...
    }

    [HttpPost]
    [MultipleButton(Name = "action", Argument = "ActionB")]
    public ActionResult MyActionB(myModel model)
    {
        ...
}

Upvotes: 2

Related Questions