powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / DropDownList из файла
10 сообщений из 10, страница 1 из 1
DropDownList из файла
    #39875635
Qwe.Qwe1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, подскажите, пожалуйста, как реализовать следующее (ASP.NET MVC): есть текстовый файл с разделителями:
Код: plaintext
1.
2.
Tokio;122344;2334.6;...
Paris;3456782;1234.7;...

Мне надо в DropDownList вывести названия города, а при выборе элемента в контроллере получить остальные значения.

Я создал класс в папке "Models":
Код: c#
1.
2.
3.
4.
5.
6.
public class City
{
    public string Name { get; set; }
    public string Population { get; set; }
    public string Area { get; set; }
}


Потом определил ViewModel:
Код: c#
1.
2.
3.
4.
5.
public class MyViewModel
{
    public IEnumerable<SelectListItem> Cities { get; set; }
    public string SelectedID { get; set; }        
}


Теперь хочу определить в контроллере привязку, но как это сделать?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
public ActionResult Index(/*ViewModel.MyViewModel myViewModel*/ ???)
{
    myViewModel = new ViewModel.MyViewModel();            
    myViewModel.Cities = new SelectList(GetDataFromCSV(), null /* ??? */, "Name");
    return View(myViewModel);
}

protected List<Models.City> GetDataFromCSV()
{
    var result = new List<Models.City>();
    // Server.MapPath("~/App_Data/Cities.csv"
    ...
}

[HttpGet]
public JsonResult GetData()
{
    string data = // ??? (myViewModel.SelectedID etc);
    return Json(data, JsonRequestBehavior.AllowGet);
}



Код: html
1.
2.
@model MyWebApp.ViewModel.MyViewModel
@Html.DropDownList("MyDropDown", Model.Cities, "--Select--")
...
Рейтинг: 0 / 0
DropDownList из файла
    #39875639
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Qwe.Qwe1,

Не понял в чём вопрос. Вижу вы читаете файл в GetDataFromCSV, заполняете модель в Index.

Какая проблема? Зачем вам GetData? Какая привязка вам ещё нужна?
...
Рейтинг: 0 / 0
DropDownList из файла
    #39875642
Qwe.Qwe1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здесь 2 момента:
1) как должен выглядеть метод "public ActionResult Index"? Худо-бедно список заполняется и выводится, но нужно ли что-то передать в Index? Мне кажется, я здесь как-то нет делаю...
2) при выборе элемента из списка у меня должен сработать Аякс-запрос (см. ниже). Но он не срабатывает. А даже когда это происходит и я оказываюсь в методе "GetData", то как получить для выбранного элемента остальные значения?

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
<script type='text/javascript'>
    $(document).ready(function () {
        $("#MyDropDown").change(function () {
            $.ajax({
                url: "GetData",
                type: 'GET',
                success: function (result) {
                    $("#div1").html(result);
                    }
                });
            });
        });
</script>
...
Рейтинг: 0 / 0
DropDownList из файла
    #39875664
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Qwe.Qwe1,

У вас должно два метода Index -- один принимает GET запрос, другой POST
и крайне желательно две разных модели на отображение и на отправку данных

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
[HttpGet]
public ActionResult Index()
{
    myViewModel = new ViewModel.MyViewModel();            
    myViewModel.Cities = new SelectList(GetDataFromCSV(), null /* ??? */, "Name");
    return View(myViewModel);
}

[HttpPost]
public ActionResult Index(PostViewModel model)
{
    if(ModelState.IsValid)
    {
        // здесь обрабатываете данные из модели
        return Redirect(...); // редирект на страницу откуда пришли или на тот же Index
    }
    // сюда попали, если переданные данные не корректны
    var myViewModel = // создаёте модель для отображения
    // возвращаете ответ с информацией об ошибках
    return View(myViewModel);
}




Qwe.Qwe12) при выборе элемента из списка у меня должен сработать Аякс-запрос (см. ниже). Но он не срабатывает. А даже когда это происходит и я оказываюсь в методе "GetData", то как получить для выбранного элемента остальные значения?

вообще не понял чего вы хотите. у вас же есть метод GetDataFromCSV, чтобы получить все остальные значения

вот более подробная дока по работе с данными в MVC

https://metanit.com/sharp/mvc5/3.2.php
...
Рейтинг: 0 / 0
DropDownList из файла
    #39875703
Qwe.Qwe1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну я хотел как в десктопе, видимо, здесь так нельзя:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
private List<Cities> _data;

public ActionResult Index()
{
    myViewModel = new ViewModel.MyViewModel();            
    _data = GetDataFromCSV();
    myViewModel.Cities = new SelectList(_data, null, "Name");
    return View(myViewModel);
}

[HttpGet]
public JsonResult GetData(string selected)
{
    // selected = Имя выбранного элемента (то есть название города)
    var d = _data.Where(x => x.Name == selected);
    return Json(JsonConvert.SerializeObject(new { name = d.Name, area = d.Area, population = x.Population }), JsonRequestBehavior.AllowGet);
}



Но список "_data" - всегда пустой. Поэтому каждый раз в методе GetData я заново по сути считываю из файла, выбираю всю доп. информацию и возвращаю обратно во View. Так заработало.

[HttpGet]
public JsonResult GetData(string selected)
{
_data = GetFromCSV();
var d = _data.Where(x => x.Name == selected);
return Json(JsonConvert.SerializeObject(new { name = d.Name, area = d.Area, population = x.Population }), JsonRequestBehavior.AllowGet);
}
[/SRC]
...
Рейтинг: 0 / 0
DropDownList из файла
    #39875729
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тебе нужно разобраться с темой "жизненный цикл запроса". Чтобы хотя бы понимать, что экземпляр контроллера (и много чего еще) создается для каждого запроса.

Ты можешь сделать свой _data статическим (не забыв про безопасность потоков), но правильно будет сделать его отдельным классом-синглтоном и получать через DI (изучив предварительно тему внедрения зависимостей)
...
Рейтинг: 0 / 0
DropDownList из файла
    #39875740
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Qwe.Qwe1Но список "_data" - всегда пустой. Поэтому каждый раз в методе GetData я заново по сути считываю из файла, выбираю всю доп. информацию и возвращаю обратно во View. Так заработало.

Основное отличие веб-приложения от десктопа -- отсутствие полностью согласованного состояния. Более того, в веб-приложениях стоит стремиться к отсутствию состояния вообще. Т.е. каждый запрос обрабатывается как "выстрелил и забыл". Если вы хотите сохранять состояние между запросами, то вам придётся ещё попотеть. ASP.NET предоставляет различные средства, чтобы вам помочь, но ни один не является ни серебряной пулей, да ещё и по сути вредны.
...
Рейтинг: 0 / 0
DropDownList из файла
    #39875741
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Proы можешь сделать свой _data статическим

Что опять-таки не гарантирует, что в нём что-то будет :)

1. веб-приложение может быть перезапущено, IIS может рестартануть прилагу в любой момент (с точки зрения клиента)

2. при масштабировании приложения более, чем на один сервер, о статиках вообще придётся забыть, кроме как для кеширования инфраструктуры
...
Рейтинг: 0 / 0
DropDownList из файла
    #39875743
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttЧто опять-таки не гарантирует, что в нём что-то будет :)Почему не гарантирует? CSV считывается при первом запросе и всё, это касается и перезапуска и масштабирования.

Само собой, когда ТС дойдет до масштабирования, он уже не станет заниматься такой глупостью, как чтение CSV ))
...
Рейтинг: 0 / 0
DropDownList из файла
    #39875746
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProПочему не гарантирует? CSV считывается при первом запросе и всё, это касается и перезапуска и масштабирования.

Скорее нужен Cache-Aside pattern , даже если в роли кеша будет выступать статик :)


Shocker.ProСамо собой, когда ТС дойдет до масштабирования, он уже не станет заниматься такой глупостью, как чтение CSV ))

Сегодня ты читаешь CSV, а завтра выбираешь между Redis и Aerospike ))
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / DropDownList из файла
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]