2013-12-17 1 views
4

У меня есть форма, которая передается через ajax на контроллер. Контроллер собирает данные из Модели, а затем создает новую ViewModel и передает ее частичному представлению, которое затем обновляется на Клиенте.Почему текстовые поля не очищаются после очистки Модель

Проблема в том, что текстовые поля не очищаются, как ожидалось. Сообщение поступает в представление как ожидалось, поэтому не имеет смысла, что текстовые поля не очищаются.

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

<input id="Address_Address1" name="Address.Address1" type="text" value="" /> 

Тем не менее, пользователь видит значение, которое было priorly введенного.

Вот контроллер:

//Process Order Here 


//This should clear out the ViewModel. 
order = new OrderViewModel(); 
order.Message = "Report Added to your cart"; 

return PartialView("_NewOrderPartial", order); 

Это частичное Вид:

@model NTC.PropertySearch.Models.OrderViewModel 

@using (Ajax.BeginForm("NewOrder", "Order", new AjaxOptions { InsertionMode =  InsertionMode.Replace, UpdateTargetId = "neworder" })) 
{ 
<div id="neworder"> 
    <table> 
     <tr> 
      <th style="width: 300px;"> 
       <h3>Enter property address below</h3> 
      </th> 
      <th style="width: 30px;"></th> 
      <th style="width: 300px;"> 
       <h3>Choose your report below</h3> 
      </th> 
     </tr> 
     <tr> 
      <td> 
       <div class="form"> 
        <table> 
         <tr> 
          <td> 
           @Html.LabelFor(m => m.Address.Address1) 
          </td> 

          <td> 
           @Html.TextBoxFor(m => m.Address.Address1) 
          </td> 

          <td> 
           @Html.ValidationMessageFor(m => m.Address.Address1) 
          </td> 
         </tr> 

         <tr> 
          <td> 
           @Html.LabelFor(m => m.Address.Address2) 
          </td> 
          <td> 
           @Html.TextBoxFor(m => m.Address.Address2) 
          </td> 

          <td> 
           @Html.ValidationMessageFor(m => m.Address.Address2) 
          </td> 
         </tr> 

         <tr> 
          <td> 
           @Html.LabelFor(m => m.Address.City) 
          </td> 
          <td> 
           @Html.TextBoxFor(m => m.Address.City) 
          </td> 

          <td> 
           @Html.ValidationMessageFor(m => m.Address.City) 
          </td> 
         </tr> 

         <tr> 
          <td> 
           @Html.LabelFor(m => m.Address.State) 
          </td> 
          <td> 
           @Html.TextBoxFor(m => m.Address.State) 
          </td> 

          <td> 
           @Html.ValidationMessageFor(m => m.Address.State) 
          </td> 
         </tr> 


         <tr> 
          <td> 
           @Html.LabelFor(m => m.Address.ZipCode) 
          </td> 

          <td> 
           @Html.TextBoxFor(m => m.Address.ZipCode) 
          </td> 
          <td> 
           @Html.ValidationMessageFor(m => m.Address.ZipCode) 
          </td> 
         </tr> 

        </table> 

        <input type="submit" value="Add Report" /> 
        @Html.DisplayFor(m=> m.Message) 

       </div> 
      </td> 
         </tr> 
    </table> 
</div>   
+0

Какой браузер? Если это IE, он может «помочь» вам, сохраняя контент. – Maess

ответ

11

Причина этого заключается в том, потому что помощники Html, такие как TextBox сначала смотрит на ModelState при связывании их и только после этого в модели просмотра. Это часто случается, когда люди пытаются изменить/очистить некоторое значение модели представления в действии контроллера HttpPost. В соответствующем представлении будет использоваться начальное значение POSTED, а не значение в модели представления.

Вы должны очистить ModelState, а в своем действии контроллера:

ModelState.Clear(); 
order = new OrderViewModel(); 

В качестве альтернативы, если вы не хотите, чтобы очистить весь ModelState (хотя в вашем случае это, кажется, так, как вы переинициализации модель всего вида) вы можете очистить только некоторые свойства, которые вы намерены изменить:

ModelState.Remove("SomeProperty"); 
viewModel.SomeProperty = "some new value"; 
+0

Пятно на ответ. –

Смежные вопросы