Asp.net core model doesn't bind from form

Kovpaev Alexey picture Kovpaev Alexey · Oct 21, 2016 · Viewed 22.8k times · Source

I catch post request from 3rd-side static page (generated by Adobe Muse) and handle it with MVC action.

<form method="post" enctype="multipart/form-data">
   <input type="text" name="Name">
   ...
</form>

Routing for empty form action:

app.UseMvc(routes => routes.MapRoute(
   name: "default",
   template: "{controller=Home}/{action=Index}"));

But in according action I have model with every property is empty

Action:

[HttpPost]
public void Index(EmailModel email)
{
   Debug.WriteLine("Sending email");
}

Model:

public class EmailModel
{
    public string Name { get; set; }
    public string Email { get; set; }
    public string Company { get; set; }
    public string Phone { get; set; }
    public string Additional { get; set; }
}

Request.Form has all values from form, but model is empty

[0] {[Name, Example]}
[1] {[Email, [email protected]]}
[2] {[Company, Hello]}
[3] {[Phone, Hello]}
[4] {[Additional, Hello]}

Answer

Stuart picture Stuart · May 2, 2017

Be careful not to give an action parameter a name that is the same as a model property or the binder will attempt to bind to the parameter and fail.

public async Task<IActionResult> Index( EmailModel email ){ ... }

public class EmailModel{ public string Email { get; set; } }

Change the actions parameter 'email' to a different name and it will bind as expected.

public async Task<IActionResult> Index( EmailModel uniqueName ){ ... }