Asp.net core model doesn't bind from form
Solution 1
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 ){ ... }
Solution 2
I'm not sure it is same case, but I had same problem and nothing really looks to work for me.
The problem in my case was that I had a property called Model in my view model class
public string Model { get; set; }
When I renamed the property to ModelName everything was working fine again, even without FromForm attribute.
Looks like some special property names could be a bit of a problem for asp.net mvc model binding.
So, my advice is to check your model properties and maybe try renaming them one by one in order to check if the problem is there.
Hope this helps.
Solution 3
I'm having the same problem this docs helps me to understand Model Binding https://docs.asp.net/en/latest/mvc/models/model-binding.html
I solved my problem by making sure that the property name is exact match in form field name and I also add [FromForm] attribute to specify exactly the binding source.
Solution 4
ASP.Net Core 3.1
In my case, I was using a complex model (a model that contains other models, like a shared model) posted by Ajax, so the inputs in the view were automatically named like this "ChildModel.PropertyName" (see code)
[HttpPost]
[ValidateAntiForgeryToken] // ("AUVM.PropertyName")
public async Task<JsonResult> AddUser([FromForm]AUVM aUVM) //Parameter name must match the first part of the input name in order to bind
{
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<JsonResult> AddUser([FromForm]AUVM someUniqueName) //This is wrong and won't bind
{
}
Solution 5
I ran into this today, and though in hindsight it seems obvious, just thought I'd add that you need to make sure your access modifiers for the Properties on the model you're binding are correct. I had public MyProperty { get; internal set; }
on some and they would not bind. Removed internal
and they worked just fine.
Related videos on Youtube
Comments
-
Kovpaev Alexey almost 2 years
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]}
-
adem caglin over 7 yearsWhy do you use
enctype="multipart/form-data"
? You don't need to specify this because your model doesn't contain any file upload. Probably your problem causes from this. Remove and try. -
Kovpaev Alexey over 7 years@ademcaglin removed
enctype
attribute. Doesn't help. StillRequest.Form
has all values, butmodel
is empty. -
adem caglin over 7 yearsDid you use any javascript code to send form?
-
Kovpaev Alexey over 7 years@ademcaglin no, just pure form submit
-
-
Kovpaev Alexey over 7 yearsDoesn't help. Also I can't use
AntiForgeryToken
because this page is not mine and generated by 3rd party tools (Adobe Muse) -
agenc over 7 yearsI think you can't get it as model with a tool which is not in action view. You can try to get value with form get method, and not as a model. By paramater names. Index(string Name, String Email, String Company, String Phone). And convert this values to your object model in procedure.
-
Kovpaev Alexey over 7 yearsI also think mvc can't find model or something, and yes I can just use a bunch of action parameters, or fill it with
Request.Form
in action, or try to do that withIModelBinder
, I just want to understand why I can't just use default model binding. Maybe I missed some conventions? -
Evil Pigeon almost 7 yearsThanks! I had a property named "Model" in my view model which broke the binding.
-
James Webster almost 7 yearsSeems like ASP.NET Core's model binding code could throw us a bone by maybe throwing an exception in this case!
-
detay almost 7 yearsI mean... Wow.. This is something I couldn't find on my own.
-
hubert17 almost 6 yearsYou are my angel!
-
Shukri Adams over 4 yearsWell, that's an hour of pointless debugging I'm never getting back.
-
Sinaesthetic about 4 yearsARE YOU KIDDING ME?! I lost HOURS to this /tableflip. THANK YOU
-
Steve Silberberg over 2 yearsOMG that's the problem I had. I would have never figured this out without your awesome help. Thank you!!