Asp.net core model doesn't bind from form

29,726

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.

Share:
29,726

Related videos on Youtube

Kovpaev Alexey
Author by

Kovpaev Alexey

Sorry for my English

Updated on July 09, 2022

Comments

  • Kovpaev Alexey
    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
      adem caglin over 7 years
      Why 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
      Kovpaev Alexey over 7 years
      @ademcaglin removed enctype attribute. Doesn't help. Still Request.Form has all values, but model is empty.
    • adem caglin
      adem caglin over 7 years
      Did you use any javascript code to send form?
    • Kovpaev Alexey
      Kovpaev Alexey over 7 years
      @ademcaglin no, just pure form submit
  • Kovpaev Alexey
    Kovpaev Alexey over 7 years
    Doesn't help. Also I can't use AntiForgeryToken because this page is not mine and generated by 3rd party tools (Adobe Muse)
  • agenc
    agenc over 7 years
    I 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
    Kovpaev Alexey over 7 years
    I 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 with IModelBinder, I just want to understand why I can't just use default model binding. Maybe I missed some conventions?
  • Evil Pigeon
    Evil Pigeon almost 7 years
    Thanks! I had a property named "Model" in my view model which broke the binding.
  • James Webster
    James Webster almost 7 years
    Seems like ASP.NET Core's model binding code could throw us a bone by maybe throwing an exception in this case!
  • detay
    detay almost 7 years
    I mean... Wow.. This is something I couldn't find on my own.
  • hubert17
    hubert17 almost 6 years
    You are my angel!
  • Shukri Adams
    Shukri Adams over 4 years
    Well, that's an hour of pointless debugging I'm never getting back.
  • Sinaesthetic
    Sinaesthetic about 4 years
    ARE YOU KIDDING ME?! I lost HOURS to this /tableflip. THANK YOU
  • Steve Silberberg
    Steve Silberberg over 2 years
    OMG that's the problem I had. I would have never figured this out without your awesome help. Thank you!!