Проблема с механизмом связывания модели ASP.NET MVC - PullRequest
3 голосов
/ 29 октября 2009

С помощью этого метода контроллера: -

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

Почему это работает ...

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>

Но это не так?

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>

Пожалуйста, не говорите мне, что имена полей определены только частично?

Поверьте мне - все, что я сделал, это добавил текст «Контакт» в каждое из полей объекта и в каждое из полей формы. Как будто MVC перепутали поля, начинающиеся с одинаковых первых 7 символов.

Что дает?

Кто-нибудь может пролить свет на это?

Paul.

Ответы [ 4 ]

4 голосов
/ 29 октября 2009

В настоящее время я не могу найти разумного объяснения, почему второй не работает. Но это работает, если вы измените свою подпись действия, чтобы она выглядела так:

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

Полагаю, это как-то связано с DefaultModelBinder.


UPDATE: Хорошо, это начинает быть действительно забавным:

// 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)

Странно, действительно!


UPDATE2:

Хорошо, понял. У вас есть свойство с именем ContactMessage в вашей модели, а имя переменной, переданное в действии, также называется contactMessage. Отсюда и двусмысленность. Нет ошибки в DefaultModelBinder. Он не может одновременно привязать свойство типа string и Contact, регистр закрыт: -)

2 голосов
/ 29 октября 2009

Возможно ли, что представление автоматически перекомпилируется при обновлении браузера, но общий проект не был перестроен, так как вы изменили имена свойств?

1 голос
/ 29 октября 2009

Кодируйте свои текстовые поля следующим образом:

 <%=html.TextBox("Contact.Name")%>

и вы подпись действия, как это:

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

Надеюсь, это поможет и удачи

0 голосов
/ 29 октября 2009
<% using(Html.BeginForm()) { %> 

отсутствует в вашем нерабочем примере.

Или .. Возможно, имя параметра contactMessage конфликтует с номером переменной в форме сообщения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...