HTML-помощник MVC3 не обновляет DropdownListFor при отправке формы - PullRequest
1 голос
/ 10 октября 2011

У меня есть простая HTML-форма с dropdwonList для привязки к цветам, текстовое поле под ней и кнопка отправки для отправки формы и сохранения цвета.

Когда я выбираю цвет из выпадающего списка, он изменитзначение текстового поля под ним, если пользователь щелкает форму отправки.он возвращается к контроллеру, и я сохраняю цвет из texebox и возвращаю представление (модель) как результат действия, но проблема в том, что dropdownlistfor не обновляется со значением текстового поля, независимо от значения в текстовом поле внутривыпадающий список или нет.

Кстати, вы можете проверить это сами. Кто-нибудь может помочь, пожалуйста?

Model.cs

public class TestModel {
    public String Color { get; set; }
}

Controller.cs

public ActionResult Index() {
        var model = new TestModel();
        model.Color="Blue";
        ViewData["Colors"]=new List<SelectListItem>() { new SelectListItem() { Text =  "Blue", Value = "Blue" }, new SelectListItem() { Text = "Red", Value = "Red" } };
        return View(model);
    }

[HttpPost]
public ActionResult Index(TestModel model) {
        model.Color="Red";
        ViewData["Colors"]=new List<SelectListItem>() { new SelectListItem() { Text =  "Blue", Value = "Blue" }, new SelectListItem() { Text = "Red", Value = "Red" } };
        return View(model);
}

Index.cs

@using (Html.BeginForm()) {
@Html.DropDownListFor(m => m.Color, ViewData["Colors"], new { @class = "w200" })
<input type="submit" />

}

Ответы [ 4 ]

1 голос
/ 10 октября 2011

Модель

public class TestModel {
    public String Color { get; set; }
    public SelectList Colors {get;set;} }

Контроллер

public ActionResult Index() {
        var model = new TestModel();
        model.Color="Blue";
        var colors =new List<SelectListItem>() { new SelectListItem() { Text =  "Blue", Value = "Blue" }, new SelectListItem() { Text = "Red", Value = "red" } };
        model.Colors = new SelectList(colors,"Text","Value");

        return View(model);
    }

[HttpPost] public ActionResult Index(TestModel model) {
        model.Color="Red";

        var colors =new List<SelectListItem>() { new SelectListItem() { Text =  "Blue", Value = "Blue" }, new SelectListItem() { Text = "Red", Value = "red" } };
        model.Colors = new SelectList(colors,"Text","Value");

        return View(model); }

Вид

@using (Html.BeginForm()) {
    <div>
        @Html.DropDownListFor(m => m.Color, Model.Colors, new { @class = "w200" })
       <input type="submit" />
     </div> 
}
0 голосов
/ 12 октября 2011

Хорошо, ребята, проблема не в том, как вы реализуете этот сценарий, проблема здесь в ModelState. Я ПОСТУПАЮ к действию и возвращаю ту же точку зрения. Во второй раз, когда представление отображается, оно будет смотреть на ModelState и использовать эти значения для заполнения элементов управления. Так что нам просто нужно очистить ModelState перед возвратом View.

Model.cs

public class TestModel {
    public String Color { get; set; }
}

Controller.cs

public ActionResult Index() {
        var model = new TestModel();
        model.Color="Blue";
        ViewData["Colors"]=new List<SelectListItem>() { new SelectListItem() { Text =  "Blue", Value = "Blue" }, new SelectListItem() { Text = "Red", Value = "Red" } };


        return View(model);
    }

[HttpPost]
public ActionResult Index(TestModel model) {
        model.Color="Red";
        ViewData["Colors"]=new List<SelectListItem>() { new SelectListItem() { Text =  "Blue", Value = "Blue" }, new SelectListItem() { Text = "Red", Value = "Red" } };

        ***ModelState.Clear();***
        return View(model);
}

Index.cs

@using (Html.BeginForm()) {
@Html.DropDownListFor(m => m.Color, ViewData["Colors"], new { @class = "w200" })
<input type="submit" />

}

Cheeeeeers

0 голосов
/ 10 октября 2011

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

[HttpPost]
public ActionResult Index(TestModel model) {
        model.Color="Red";
        var colors = new List<SelectListItem>() { new SelectListItem() { Text =  "Blue", Value = "Blue" }, new SelectListItem() { Text = "Red", Value = "Red" } };

        SelectListItem selectedColor = colors.Where(c => c.Text == model.Color).FirstOrDefault();
        if (selectedColor != null)
        {
            selectedColor.Selected = true;
        }
        else
        {
            colors.Add(new SelectListItem() { Text = model.Color; Value = model.Color; Selected = true; };
        }
        ViewData["Colors"] = colors;
        return View(model);
}

РЕДАКТИРОВАТЬ

После некоторого тестирования и копания, кажется, что вам нужно будет использовать javascript для этого, как объяснено в этом ТА вопрос .Другой вариант - бросить своего помощника.

0 голосов
/ 10 октября 2011

Вам необходимо включить все цвета в действие Post.

Также не используйте ViewData, но добавляйте элементы для вашей модели представления:

public class TestModel {
    public String Color { get; set; }
    IEnumerable<SelectListItem> AvailableColors {get;set;}
}

Но поскольку модели представления предназначены длябыть использованы для абстрагирования ваших моделей, вы можете сделать что-то вроде:

public class TestModel {
    public TestModel(IEnumerable<string> colors)
    {
        AvailableColors = colors.Select(c => new SelectListItem{Text=c, Value = c});
    }

    public String Color { get; set; }
    IEnumerable<SelectListItem> AvailableColors {get;}
}

И в вашем контроллере:

public ActionResult Index() {
    var model = new TestModel(new string[]{"Red", "Green", "Blue"});
    model.Color="Blue";
    return View(model);
}
...