ASP.NET MVC2 InputHelper и List.Insert () странное поведение - PullRequest
0 голосов
/ 10 ноября 2010

Я не могу понять это ...

Упрощенный код, приведенный ниже, ДОЛЖЕН вставлять новое поле формы второго значения текущего времени.

Вместо этого, даже несмотря на то, что манипулирование списком происходит правильно (как проверяется в контроллере и в выходных данных отладки), представление действительно отображает дополнительный элемент, но, похоже, является просто копией значения окончательного поля (до отправки) , Это можно проверить, изменив поле перед отправкой - значения сохраняются, а новый элемент дублирует переданное окончательное значение.

Часть, которая действительно готовит мою лапшу, заключается в том, что, если я тривиально меняю операцию с Insert () на Add (), Add () работает как положено !!

Используя этот пример Модель:

public class MyViewData
{
  List<string> stringData = new List<string>();
  public List<string> StringData { get { return stringData; } }
}

А этот контроллер:

public class TestController : Controller
{
  public ActionResult Index()
  {
    return View(new MyViewData());
  }

  [HttpPost]
  public ActionResult Index(MyViewData data)
  {
    data.StringData.Insert(0, DateTime.Now.Second.ToString());

    return View(data);
  }
}

А это вид:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<Forms.Controllers.MyViewData>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    Test
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <%      
        System.Diagnostics.Debug.WriteLine("---");
        for (var i = 0; i < Model.StringData.Count; i++)
            System.Diagnostics.Debug.WriteLine("{0}", Model.StringData[i]);
    %>

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

        <% for (var i = 0; i < Model.StringData.Count; i++) { %>

            <%: Html.TextBoxFor(model => model.StringData[i])%></br>

        <% } %>

        <div><input type="submit" value="Do it" /></div>

    <% } %>
</asp:Content>

1 Ответ

1 голос
/ 10 ноября 2010

Это нормальное поведение стандартных помощников HTML, и оно разработано. При рендеринге поля ввода они сначала смотрят значения запроса POSTed и только после этого в ViewData и модели представления. Это в основном означает, что вы не можете изменить значения POSted в действии вашего контроллера.

Итак, если у вас есть форма с полем ввода:

<%= Html.TextBoxFox(x => x.Id) %>

который размещен для следующего действия

[HttpPost]
public ActionResult Index(MyModel model)
{
    model.Id = "some new value";
    return View(model);
}

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

<input type="text" name="StringData[<%= i %>]" value="<%= Model.StringData[i] %>" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...