Как формы предварительно заполнены в ASP.Net MVC? - PullRequest
0 голосов
/ 31 мая 2009

Когда у вас есть форма ASP.Net MVC, созданная Html.BeginForm (), как заполняются поля внутри нее? В случае

<asp:Content ID="Main" ContentPlaceHolderID="MainContent" runat="server">
<h2>Edit Dinner</h2>
<%= Html.ValidationSummary("Please correct the errors and try again.") %>
<% using (Html.BeginForm()) { %>
   <p>
       <label for="Title">Dinner Title:</label>
       <%= Html.TextBox("Title") %>
       <%= Html.ValidationMessage("Title", "*") %>
   </p>

Откуда берется значение для Html.TextBox ("Заголовок")? Я знаю, модель. И в этом случае модель имеет поле заголовка. Но у меня есть случаи, когда мне нужно создать модель представления, поэтому я получаю что-то вроде:

public class DinnerViewModel {
    public Dinner Dinner {get; set;};
    public SomethingElse SomethingElse {get; set;};
}

и используйте это как модель, <% = Html.TextBox ("Title")%> получает правильное значение. Или, по крайней мере, это происходит, если проверка не пройдена и форма отображается повторно.

Я спрашиваю, потому что у меня есть случай формы, которая отправляется через AJAX (с использованием Ajax.BeginForm ()), и форма обновляется. Я создаю новый объект модели, пустой, для него, но он все еще загружает значения последней отправки. Когда я отправляю без AJAX, все работает нормально.

Обновление

Я смотрю отладчик в шаблоне. Model.Dinner.Title равен "", но Html.TextArea ("Title", Model.Dinner.Title) помещает предыдущее значение, которое было отправлено в текстовую область.

Ответы [ 3 ]

2 голосов
/ 27 августа 2009

Данные хранятся в ModelState. Методы HtmlHelper будут искать значения, сохраненные в состоянии модели, на основе имени элемента формы. ModelState очищается, когда я перенаправляю, а не когда я просто возвращаюсь, как в случае вызова AJAX.

0 голосов
/ 01 июня 2009

Я не уверен, что понимаю проблему. Вы делаете ajax-запрос, но текстовые поля в вашей форме все еще содержат свои значения после вызова?

Если это так, то вам следует убедиться, что эти текстовые поля находятся внутри элемента, связанного со свойством UpdateTargetId класса AjaxOption. Когда вы делаете ajax-запрос, обновляется только часть вашей страницы (на которую ссылается свойство UpdateTargetId). Остальные поля на вашей странице не будут обновляться независимо от того, обновляете ли вы свою модель или нет. Посмотрите на этот пример:

<%= Html.TextBox("Title") %>
....
<div id="myDiv">
    <%= Html.TextBox("SomeField") %>
</div>

<% using (Ajax.BeginForm(new AjaxOptions() { UpdateTargetId = "myDiv" })) {%>
    //... blah blah blah
<% } %>

Когда вы отправляете форму ajax, обновляется только поле SomeField, поле заголовка остается неизменным.

Когда вы отправляете обычную форму, вся страница обновляется, поэтому все поля обновляются без ajax.

РЕДАКТИРОВАТЬ: Опечатка.

0 голосов
/ 31 мая 2009

Вы также можете сделать значения пустыми:

<% =Html.TextBox("Title", null, new { @value = '' }); %>

Было бы лучше, хотя бы передать пустую модель (значения по умолчанию) в представление? РЕДАКТИРОВАТЬ Вот что вы делаете, я вижу;). Просто перейдите к моему первому предложению, проверьте, является ли запрос AJAX-запросом или нет, затем на основании этого передайте emtpy @value в TextBox.

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