Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Issue with ASP.NET MVC model binder

Tags:

asp.net-mvc

With this controller method: -

    [AcceptVerbs(HttpVerbs.Post)]
    public ViewResult Contact(Contact contactMessage)
    {
        return View();
    }

Why does this work...

public class Contact
{
    public string Name { get; set; }
    public string Email { get; set; }
    public string Message { get; set; }
}

<% using(Html.BeginForm()) { %>
<p>Name : <%= Html.TextBox("Name")%></p>
<p>Email : <%= Html.TextBox("Email")%></p>
<p>Message : <%= Html.TextBox("Message")%></p>
<p><input type="submit" value="Send Data" /></p>

But this doesn't?

public class Contact
{
    public string ContactName { get; set; }
    public string ContactEmail { get; set; }
    public string ContactMessage { get; set; }
}

<p>Name : <%= Html.TextBox("ContactName")%></p>
<p>Email : <%= Html.TextBox("ContactEmail")%></p>
<p>Message : <%= Html.TextBox("ContactMessage")%></p>
<p><input type="submit" value="Send Data" /></p>

Please don't tell me that field names are only partially identified ?

Trust me - All I did was add the text "Contact" to each of the fields in the object and each of the fields in the form. Its almost as if MVC got confused with the fields all starting with the same first 7 characters.

What gives ?

Can anyone shed any light on this ?

Paul.

like image 207
Paul Stringer Avatar asked Nov 17 '25 19:11

Paul Stringer


1 Answers

I currently can't find any reasonable explanation as to why the second is not working. But it works if you change your action signature to look like this:

public ViewResult Index([Bind(Prefix="")]Contact contactMessage)

I suppose this has something to do with the DefaultModelBinder.


UPDATE: Ok, this starts to be really funny:

// Not working
public ViewResult Index(Contact contactMessage)

// Not working
public ViewResult Index(Contact contactmessage)

// Working
public ViewResult Index(Contact contact)

// Working
public ViewResult Index(Contact contactMsg)

// Working
public ViewResult Index(Contact abc)

Strange indeed!


UPDATE2:

Ok got it. You have a property called ContactMessage in your model and the variable name passed in the action is also called contactMessage. This is where the ambiguity comes from. No bug in the DefaultModelBinder. He can't bind at the same time to a property of type string and Contact, case closed :-)

like image 167
Darin Dimitrov Avatar answered Nov 20 '25 15:11

Darin Dimitrov



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!