MVC3 Razor - значения TextBoxFor (), привязанные к модели представления, не обновляются правильно после возврата из Post - PullRequest
4 голосов
/ 29 марта 2011

Мое представление отображает ряд строк в HTML-таблице. Строки упорядочены в порядке ранжирования из базы данных. Одним из столбцов в html-таблице является текстовое поле, которое позволит пользователю изменять этот порядок ранжирования. Внизу таблицы есть кнопка «Обновить», которая позволит пользователю сохранить этот новый заказ. Проблема, с которой я сталкиваюсь, состоит в том, что порядок ранжирования корректно обновляется в базе данных, но когда контроллер возвращается к представлению, все данные корректно обновляются на экране, но значения в текстовом поле не обновляются.

Order   |  Data     
================================================
10      |  Item 1
20      |  Item 2
30      |  Item 3

Lets say the user makes the following changes
Order   |  Data
================================================
50      |  Item 1
20      |  Item 2
10      |  Item 3

Now User hits update and what is rendered is:

Order   |  Data
================================================
50      |  Item 3
20      |  Item 2
10      |  Item 1

(Note data was sorted correctly but values of TextBoxFor did not update)

Код моего просмотра

@using (Html.BeginForm("UpdateRanks", "MyController")) {
    <table cellpadding="0" cellspacing="0" width="100%">
    @for (int i = 0; i < Model.DbSelections.Count; i++) {
       var item = Model.DbSelections[i];
       <tr>
        <td>
            @Html.TextBoxFor(m => m.DbSelections[i].Rank, new { @class = "NarrowTextBox" })
        </td>
        <td>
            @Model.DbSelections[i].Rank (works!), @item.ItemName<br />
        </td>
       </tr>
    }
    <input type="submit" value="Update" name="updateaction"  class="StandardButton"/>
</table>
}

Код контроллера:

[HttpPost]
[MultiButton(MatchFormKey = "updateaction", MatchFormValue = "Update")]
public ActionResult UpdateRanks(MyViewModel model) {

    if (ModelState.IsValid) {

        MyRepository myRepo = new MyRepository();
        <!-- saves updated ranks to database - it works -->
        myRepo.UpdateAutoPicks(...);

        <!-- after saved ranks above, now reload data including ranks from database -->
        <!-- debugging shows that data and ranks and ordering is correct->
        model.DbSelections = myRepo.GetItems();

        return View("Index", model);


    } else {
        <!-- blah -->
    }

    return View("Index", model);
}

Ответы [ 3 ]

4 голосов
/ 29 марта 2011

Посмотрите, поможет ли вам этот другой пост .

Единственное предостережение при использовании этого решения заключается в том, что вы потеряете все встроенные функции использования TextBoxFor (), такие как проверка. Если это не работает, вы можете попытаться выполнить ModelState.Clear (), чтобы очистить введенные значения (см. здесь для получения более подробной информации).

0 голосов
/ 15 июня 2013

Вам не нужно очищать весь ModelState, только тот, который вы хотите обновить ... Это может уменьшить нежелательные побочные эффекты:

В качестве примера у меня есть фрагмент кода, который форматирует предоставленный пользователем номер телефона, а не только проверяет его, в 10-значный формат США. Это вернет «очищенное» значение для этого поля:

ModelState ["Phone"]. Value = new ValueProviderResult (dummyph, dummyph, System.Globalization.CultureInfo.CurrentUICulture);

0 голосов
/ 10 февраля 2012

У меня была такая же проблема, и ModelState.Clear () в контроллере решил эту проблему.Однако я не уверен, что это правильно.

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