MVC3 - проблема с использованием редакторов - PullRequest
1 голос
/ 09 апреля 2011

Если бы это была проблема с MVC3, там были бы сообщения об этом, но я не могу найти ни одного.Я должен делать что-то не так.У меня есть простое представление (Index.cshtml), которое перебирает список с помощью цикла for.В каждой итерации я выводил два текстовых ввода со значениями из одного из элементов списка.

@{Html.BeginForm();}
@Html.Encode("\n")
@for (int i = 0; i < Model.SortOptions.Count; i++ )
{
    @Html.TextBoxFor(m => m.SortOptions[i].ColumnName);
    @Html.Encode("\n");
    @Html.TextBoxFor(m => m.SortOptions[i].Direction);
    @Html.Encode("\n");
}
<input type="submit" value="Submit" />
@{Html.EndForm();}

У меня есть два контроллера для представления, один для запросов GET и один для POST.Версия POST добавляет в список другие элементы, чем версия GET.Вот тут и возникает проблема. После перезагрузки страницы текстовые поля имеют то же значение, что и при загрузке страницы в GET.

Сначала я подумал, что это проблема с кэшированием, ноесли я изменю код (как показано ниже), чтобы вручную добавить текстовые входы и вставить значения в HTML, новые значения будут отправлены в браузер.

@{Html.BeginForm();}
@Html.Encode("\n")
@for (int i = 0; i < Model.SortOptions.Count; i++ )
{
    var columnNameName = string.Format("SortOptions[{0}].ColumnName", i);
    var columnNameID = string.Format("SortOptions_{0}__ColumnName", i);
    var directionName = string.Format("SortOptions[{0}].Direction", i);
    var directionID = string.Format("SortOptions_{0}__Direction", i);

<input type="hidden" name="@columnNameName" id="@columnNameID" value="@Model.SortOptions[i].ColumnName" />
<input type="hidden" name="@directionName" id="@directionID" value="@Model.SortOptions[i].Direction" />

}
<input type="submit" value="Submit" />
@{Html.EndForm();}

Я прошел через кодчтобы убедиться, что модель содержит ожидаемые значения во время их отправки в представление.Я даже проверил значения списка, шагая по коду в представлении.Кажется, он имеет правильные значения, но когда я просматриваю его в браузере, он имеет значения, которые должны соответствовать тому, когда страница ответила на запрос GET.Это проблема с шаблонами редактора?Я только начал использовать mvc3 и бритвенный двигатель, поэтому я многого не знаю.Любая помощь будет оценена.

----- ОБНОВЛЕНИЕ: ДОБАВЛЕННЫЙ КОД КОНТРОЛЛЕРА ----

    [HttpGet]
    public ActionResult Index()
    {
        var inv = new InventoryEntities();
        var model = new IndexModel(inv);
        model.SortOptions = new List<SortOption>();
        model.SortOptions.Add(new SortOption { ColumnName = "Model", Direction = SortDirection.Ascending });
        model.SortOptions.Add(new SortOption { ColumnName = "Make", Direction = SortDirection.Ascending });
        //Load data
        model.LoadEquipmentList();

        return View(model);
    }


    [HttpPost]
    [OutputCache(Duration = 1)]
    public ActionResult Index(List<SortOption> sortOptions, SortOption sort)
    {
        var inv = new InventoryEntities();
        var model = new IndexModel(inv);
        ModelState.Remove("SortOptions");
        model.SortOptions = new List<SortOption>();
        model.SortOptions.Add(new SortOption { ColumnName = "Type", Direction = SortDirection.Descending });
        model.SortOptions.Add(new SortOption { ColumnName = "SubType", Direction = SortDirection.Descending });
        model.EquipmentList = new List<EquipmentListItem>();
        model.EquipmentList.Add(new EquipmentListItem { ID = 3, AssignedTo = "Mike", Location = "Home", Make = "Ford", Model = "Pinto", Selected = false, SubType = "Car", Type = "Vehicle" });

        return View(model);
    }

Ответы [ 2 ]

0 голосов
/ 09 апреля 2011

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

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View(new MyViewModel { Name = "foo" });
    }

    [HttpPost]
    public ActionResult Index(MyViewModel model)
    {
        model.Name = "bar";
        return View(model);
    }
}

и вид:

@model MyViewModel
@using (Html.BeginForm())
{
    @Html.TextBoxFor(x => x.Name)
    <input type="submit" value="OK" />
}

Теперь, когда вы отправляете форму, вы ожидаете, что значение в текстовом поле изменится на "bar", поскольку это то, что вы указали в действии POST, но значение не изменится. Это потому, что в состоянии модели уже есть значение с ключом Name, в котором содержится то, что ввел пользователь. Поэтому, если вы хотите, чтобы это работало, вам нужно удалить исходное значение из состояния модели:

[HttpPost]
public ActionResult Index(MyViewModel model)
{
    // remove the original value if you intend to modify it here
    ModelState.Remove("Name");
    model.Name = "bar";
    return View(model);
}

То же самое происходит и в вашем сценарии. Поэтому вам может потребоваться удалить изменяемые вами значения из состояния модели в вашем действии POST.

0 голосов
/ 09 апреля 2011

Пара вещей всплывает на меня - не видя немного больше, трудно сказать, но ... оба из них могут быть переписаны как таковые. Дополнительные символы @ не нужны.

@using(Html.BeginForm()) {
    Html.Encode("\n")
    for (int i = 0; i < Model.SortOptions.Count; i++ ) {
        Html.TextBoxFor(m => m.SortOptions[i].ColumnName);
        Html.Encode("\n");
        Html.TextBoxFor(m => m.SortOptions[i].Direction);
        Html.Encode("\n");
    }
    <input type="submit" value="Submit" />
}


@using (Html.BeginForm()) { 
    Html.Encode("\n");
    for (int i = 0; i < Model.SortOptions.Count; i++ ) {
        var columnNameName = string.Format("SortOptions[{0}].ColumnName", i);
        var columnNameID = string.Format("SortOptions_{0}__ColumnName", i);
        var directionName = string.Format("SortOptions[{0}].Direction", i);
        var directionID = string.Format("SortOptions_{0}__Direction", i);

        <input type="hidden" name="@columnNameName" id="@columnNameID" value="@Model.SortOptions[i].ColumnName" />
        <input type="hidden" name="@directionName" id="@directionID" value="@Model.SortOptions[i].Direction" />

    }
    <input type="submit" value="Submit" />
}

В противном случае ваши вещи выглядят правильно, и я не вижу ничего плохого на макушке.

...