Как я могу изменить значения, которые привязаны к первому параметру (лямбда-выражению) в методе вспомогательной функции html ListBoxFor ()? - PullRequest
0 голосов
/ 05 октября 2018

Ниже мой код зрения:

@model MvcDemo.Models.viewmodelCities
@{
    ViewBag.Title = "Index";
}
<h2>Index</h2>
<div>
    @using (@Html.BeginForm())
    {
        @Html.ListBoxFor(x => x.SelectedCities, Model.Cities, new { 
        size=@Model.Cities.Count()})
        <br/>
        <input type="submit" value="submit" />
    }
</div>

модель:

public class viewmodelCities
    {
        public IEnumerable<SelectListItem> Cities { get; set; }
        public IEnumerable<String> SelectedCities { get; set; }
    }

метод действия контроллера для Get:

[HttpGet]
        public ActionResult Index()
        {
            EmployeeDbContext db = new EmployeeDbContext();
            List<SelectListItem> listSelecteditem = new List<SelectListItem>();
            foreach (tblCity city in db.tblCities)
            {
                SelectListItem selectListItem = new SelectListItem()
                {
                    Text = city.Name,
                    Value = city.ID.ToString(),
                    Selected = city.IsSelected
                };
                listSelecteditem.Add(selectListItem);
            }
            viewmodelCities vmc = new viewmodelCities();
            vmc.Cities = listSelecteditem;
            return View(vmc);
        }

& метод действия контроллера дляpost:

[HttpPost]
        public string Index(IEnumerable<string> SelectedCities)
        {
            if(SelectedCities==null)
            {
                return "You did not select any city";
            }
            else
            {
                StringBuilder sb = new StringBuilder();
                sb.Append("You selected - "+string.Join(",",SelectedCities));
                return sb.ToString();
            }
        }

В выходных данных, когда я выбираю любые города, В методе post их идентификаторы автоматически привязываются к IEnumerable. Поэтому, когда я выбираю города с идентификаторами: 3 и 4, я получаю следующий вывод.

You selected - 3,4

Как вы можете видеть во всем коде, я нигде не вставляю значения в selectCities.Поскольку я новичок в mvc и не совсем понимаю, что это за соглашения, может кто-нибудь объяснить, как значения привязываются к IEnumerable во время обратной передачи?Как я могу настроить здесь, чтобы публиковать названия городов вместо идентификаторов? Есть ли способ обойти это? PS: я получил этот код из онлайн-урока

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Для элемента управления списком выбранные значения будут опубликованы.Если вы хотите указывать названия городов вместо идентификаторов, вы можете установить Value = city.Name при заполнении поля SelectList.

foreach (tblCity city in db.tblCities)
{
    SelectListItem selectListItem = new SelectListItem()
    {
        Text = city.Name,
        Value = city.Name, // <-- change to this
        Selected = city.IsSelected
    };
    listSelecteditem.Add(selectListItem);
}

Кроме того, если вы заинтересованы в коде гольф, вы можете использоватьРасширение LINQ Select() для проецирования вашего dbtblCities в List<SelectListItem> без явного использования цикла:

var listSelecteditem = db.tblCities.Select(x => new SelectListItem {
    Text = city.Name,
    Value = city.Name,
    Selected = city.IsSelected }).ToList();
0 голосов
/ 05 октября 2018

Вы фактически устанавливаете значения для selectCities.

По вашему мнению, у вас есть следующая форма:

@using (@Html.BeginForm())
{
    @Html.ListBoxFor(x => x.SelectedCities, Model.Cities, new { 
    size=@Model.Cities.Count()})
    <br/>
    <input type="submit" value="submit" />
}

Здесь вы используете следующую строку для генерации списка:

    @Html.ListBoxFor(x => x.SelectedCities, Model.Cities, new { size=@Model.Cities.Count()})

Посмотрите документацию по этой функции. Вот как вы «вставляете» выбранные города, когда нажимаете кнопку.

По сути, вы предоставляете следующее функции:

  • x => x.SelectedCities -> Города, которые по умолчанию выбраны в списке из вашей viewModel И из выбранных городов, которые будутбыть отправленным в метод POST Index вашего контроллера при отправке формы.
  • Model.Cities -> Все доступные опции в списке из вашей viewModel.
  • new { size=@Model.Cities.Count()} --> Установка размера HTML-атрибута.

Поскольку вы используете форму, всякий раз, когда вы нажимаете кнопку «отправить», клиент отправляет IEnumerable<string> SelectedCities в ваш метод POST, Index.Вот как ваш контроллер получает выбранные значения, а затем выводит этот текст.

Надеюсь, это поможет.Я могу попытаться уточнить, если это необходимо.Я предлагаю прочитать документацию по этой функции и функции BeginForm(), чтобы получить более подробные сведения.

РЕДАКТИРОВАТЬ: я понял, что вы также спрашивали, как установить список selectedCities.Вы должны настроить этот список так же, как вы устанавливаете член Cities вашей ViewModel в методе GET Index на вашем контроллере:

vmc.Cities = listSelecteditem;

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

Например:

[HttpGet]
public ActionResult Index()
{
    EmployeeDbContext db = new EmployeeDbContext();
    List<SelectListItem> listSelecteditem = new List<SelectListItem>();
    foreach (tblCity city in db.tblCities)
    {
        SelectListItem selectListItem = new SelectListItem()
        {
            Text = city.Name,
            // Tweaked to use Name instead of ID in post.
            Value = city.Name,
            Selected = city.IsSelected
        };
        listSelecteditem.Add(selectListItem);
    }
    viewmodelCities vmc = new viewmodelCities();

    // Simply set your SelectedCities here, and it will be reflected on your page.
    vmc.SelectedCities = SomeService.GetSomeCities(someFilter);

    vmc.Cities = listSelecteditem;
    return View(vmc);
    }

, где SomeService.GetSomeCities - это созданная мной функция, которая возвращает IEnumerable<String> городаидентификаторы.Я также изменил инициализацию списка выбора, чтобы использовать имя в качестве значения вместо идентификатора.

...