Перепривязка списка текстовых полей в ASP MVC2 VS2010 Beta2 после обратной передачи - PullRequest
1 голос
/ 02 февраля 2010

Итак .. У меня проблема. Я уверен, что почти любой, кто пробовал MVC, имел это. Тем не менее, мне не удалось найти решение или подумать о нем для себя.

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

Итак, я сделал небольшой пример, чтобы проиллюстрировать проблему:

    <% using (Html.BeginForm()) {%>

    <fieldset>
        <legend>Fields</legend>
        <% foreach(string s in Model) { %>
        <p>
          <%= Html.TextBox("list",s) %>
        </p>
        <% } %>
        <p>
            <%= Html.TextBox("newstr") %>
        </p>
        <p>
            <input type="submit" value="Save" />
        </p>
    </fieldset>

    <% } %>

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

    [AcceptVerbs(HttpVerbs.Get)]
    public ActionResult Edit()
    {
        return View(new List<string>() { "aa", "bb", "cc" });
    }

    // Remove empty strings and add the new one
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Edit(List<string> list, string newstr)
    {
        List<string> res = list.Where(s => !string.IsNullOrWhiteSpace(s)).ToList();

        if (!string.IsNullOrWhiteSpace(newstr))
            res.Add(newstr);

        return View(res);
    }

Итак, при первом GET я возвращаю 3 строки aa, bb и cc и получаю 3 текстовых поля с их текстом, а также пустое текстовое поле для новых строк, например:

aa
bb
cc
Empty.

Теперь, если я очищу строку bb и добавлю «dd» в пустое текстовое поле, я получу список возврата «aa», «», «cc» и «dd» в newstr. Это возвращает новый список «aa», «cc», «dd», который я и ожидал увидеть в своих флажках. Вместо этого я получаю:

aa
aa
aa
dd (expected empty)

Итак ... Есть что-то фундаментальное, чего я не понял :) Почему он игнорирует мою новую модель данных и использует некоторые старые и не все?

Полагаю, это какой-то остаток состояния просмотра с asp.net, так как мне его отключить? Я действительно хочу, чтобы веб-страница без гражданства рекламировалась.

Ответы [ 2 ]

0 голосов
/ 02 февраля 2010

Если вы посмотрите на свой HTML-источник, вы увидите, что это не имеет никакого отношения к viewstate. При заполнении входных данных после публикации платформа сначала выполняет поиск по опубликованным значениям и заполняет ваши входные данные на основе этого. Вот почему вы получите «дд» в вашем последнем входе. Причина, по которой вы получаете «аа» в остальных входах, заключается в том, что они имеют одинаковое имя. Ваш пост будет выглядеть примерно так:

list = "aa", list = "", list = "cc"

Таким образом, когда вы визуализируете вход с именем «список», каркас будет искать этот пост и принимать первое значение, которое соответствует. Это будет "аа" каждый раз. Вот почему вы получаете «аа» во всех ваших входах. Вы не должны иметь несколько <input type="text" /> с тем же именем. С уникальными именами вы исправите проблему с зацикленными вводами.

Я не уверен, есть ли способ заставить <%=Html.TextBox()%> не просматривать опубликованные данные. Но вы всегда можете изменить его на обычный <input type="text" name="newstr" />, и это сработает.

0 голосов
/ 02 февраля 2010

Интересная проблема. Кажется, есть проблема внутри Html.TextBox (). Я отладил ваш код, и, как вы видите, модель в представлении содержит правильный список. (Кстати, я проверял это в Visual Studio 2008).

Когда вы конвертируете

<%=Html.TextBox("list", s) %>

к стандарту

<input id="list" name="list" value="<%=s %>" /> 

работает так, как должно работать. Это опция?

...