Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ASP.NET MVC - POST Action Method with Additional Parameters from URL

With ASP.net MVC is it possible to POST a form to a controller action which includes parameters not in the form, but from the URL?

For example

The Action method in GroupController:

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Create(int idOne, int idTwo, Model model)
    { ... }

The route:

"{controller}/{action}/{idOne}/{idTwo}"

Posted URL:

/Employee/Show/1/42

In this example, the form is being posted to a different controller, the model has the correct value, however the other parameters have default values 0.

The behavior I was expecting is that the ModelBinder would see that I have two parameters that match the given route, and assign the current values of 1 and 42 to the parameters in the same same way a GET operation works.

Is this behavior not supported, or am I missing something?

EDIT: To be clear, the form on the Show view for the controller Employee contains a form which is posting to a different controller. We can call it Group.

The form action URL looks like this

/Groups/Create/0/0

The form is declared as follows

Html.BeginForm("Create", "Groups")

After trying many different overloads for Html.BeginForm I have found that the parameters are only mapped when the form action URL matches the current URL in the browser address bar.

So if i navigate to the URL /Groups/Create/1/42 I will have a new form. If I then submit the form, the URL route values are passed to the POST action.

like image 867
Karl Avatar asked Mar 17 '10 20:03

Karl


Video Answer


2 Answers

If I understand your question correctly, you want the action of the rendered <form> element pointing to URL containing route values. This should be possible with one of the overloads of the HtmlHelper.BeginForm() extension method:

Html.BeginForm("action","controller", new { idOne=1, idTwo=2 }, FormMethod.Post);

Let me know if I got your question all wrong :)

like image 135
Jørn Schou-Rode Avatar answered Sep 20 '22 21:09

Jørn Schou-Rode


I had a similar problem, the configuration RouteConfig has solved this problem.

public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
             ...
             routes.MapRoute(
             "MyRoute",
             "{controller}/{action}/{idOne}/{idTwo}",
             new
             {
                 controller = "Employee", // as an example
                 action = "Show",
                 idOne = UrlParameter.Optional,
                 idTwo= UrlParameter.Optional
             }, new { idOne = @"\d{1,5}" });

        }
    }

...And... Html.BeginRouteForm()

@using (Html.BeginRouteForm("MyRoute", new { idOne = 1, idTwo= 2 }, FormMethod.Post))

Writes an opening tag to the response. When the user submits the form, the request will be processed by the route target. This member is overloaded. For complete information about this member, including syntax, usage, and examples, click a name in the overload list.

And all works

like image 20
Ilya Avatar answered Sep 21 '22 21:09

Ilya