Search code examples
asp.net-mvc-3formcollection

Formcollection doesn't extract data from form MVC


I have trouble with formcollection.

I have some form in view, and two submit buttons both with unique name="". On debug I get on controller in formcollection all data except "name" of submitted button... I don't know why, 'cos I use this in other forms and there it works good. So I look at the code, but I couldn't find any differencies in using formcollection on not working formcol and working formcol. I tried rename buttons, move them, add referencies which I thought that could help... Nothing. On every submit skip my condition because it give me back only "false" and formcollection my "upload" or "save" button on onclick doesn't contain...

So I would like to ask you for help with this. Can you tell me where could be an error? Thanks to all!

This is in controller:

[HttpPost]
public ActionResult EditUser(EditUserVM model, int id, FormCollection c)
{
    //c["upload"] is everytime set to null, 'cos c does't contain it 
    if (c["upload"] != null)
    {
            //.... some code
            return RedirectToAction("Index", "Home");
    }

    if (ModelState.IsValid)
    {
           //.... next code 
    }

    return View("EditUser", model);
}

This is in View:

    @model PrukazOnline.ViewModels.EditUserVM
@{
    ViewBag.Title = "EditUser";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<script type="text/javascript" src="@Url.Content("~/Scripts/jquery.validate.min.js")"></script>
<script type="text/javascript" src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")"></script>
<script type="text/javascript" src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")"></script>
@using (Html.BeginForm("EditUser", "User", null, FormMethod.Post, new { @class = "form-horizontal", id = "formstep", enctype = "multipart/form-data" }))
{
    @*Here is some code - @Html.TextBoxFor(x => x.something) and @Html.ValidationMessageFor(x => x.something) - all of these are in formcollection*@   
    .
    .
    .
    .
    <div>
        <input type="submit" value="Nahrát" class="upl" name="upload" id="upload" />
    </div>

    <div class="submit_buttons">
            <input type="submit" name="save" id="save" value="Uložit" />
    </div>
}

Solution

  • Issue is in multiple submit inputs in single form. There will only clicked button in FormCollection.
    I suppose you try to vary form processing base on clicked button, in this case it's better to use different Actions for each button like this:

    View:

    <div>
        <input type="submit" value="Nahrát" class="upl" name="upload" id="upload" />
    </div>
    
    <div class="submit_buttons">
            <input type="submit" name="save" id="save" value="Uložit" />
    </div>
    

    Controller:

    [HttpParamAction]
    [HttpPost]
    public ActionResult Upload(EditUserVM model)
    {
        ...
    }
    
    [HttpParamAction]
    [HttpPost]
    public ActionResult Save(EditUserVM model)
    {
        ...
    }