Получить dataTextField из SelectList в ASP. NET Core 3.1 MVC - PullRequest
1 голос
/ 13 июля 2020

У меня есть раскрывающийся список, который я заполнил данными с помощью SelectList. Я передаю данные из раскрывающегося списка на вторую страницу (NewPage). Моя цель - получить третий параметр (FirstName) из SelectList в моем контроллере.

View

<select name="dropdown1" asp-items="@(new SelectList(ViewBag.message, "ID", "FirstName"))"></select>

Controller:

        [HttpGet("[action]")]
        public IActionResult NewPage(string dropdown1)
        {
            string firstName = Request.Form["dropdown1"];
            int intID = Convert.ToInt32(dropdown1);
            List<PersonModel> data = new List<PersonModel>()
            {
                new PersonModel()
                {
                    ID = intID,
                    FirstName = firstName
                }
            };
            TempData["Data"] = System.Text.Json.JsonSerializer.Serialize(data);
            return RedirectToAction("NewPage", "NewPage");
        }

Строковая переменная firstName в мой контроллер нулевой. И я получаю сообщение об ошибке, что тип содержимого недействителен. Обычно я использую Request.Form [""] для получения текста из поля, но в данном случае он не работает, потому что это поле выбора, а не поле ввода. Любые предложения о том, как я могу получить текст из поля выбора / 3-й параметр из списка SelectList? Спасибо за уделенное время!

Ответы [ 2 ]

0 голосов
/ 14 июля 2020

И я получаю сообщение об ошибке, что тип содержимого недействителен.

У вас есть эта проблема, потому что действие является запросом Get, переданный параметр имеет форму строки запроса , поэтому

string firstName = Request.Form["dropdown1"];

следует заменить на

string firstName =Request.Query["FirstName"]; 

А затем использовать Ajax, чтобы получить как ID, так и firstName в View, это моя демонстрация, надеюсь, она вам поможет. :

Контроллер:

public IActionResult DropList()
        {
            ViewBag.message = new List<PersonModel>()
            {
                new PersonModel(){ ID=1,FirstName="AA"},
                new PersonModel(){ ID=2,FirstName="BB"},
                new PersonModel(){ ID=3,FirstName="CC"},
            };
                return View();
        }


        [HttpGet("[action]")]
        public IActionResult NewPage(string dropdown1)
        {
            string firstName =Request.Query["FirstName"];
            int intID = Convert.ToInt32(dropdown1);
            List<PersonModel> data = new List<PersonModel>()
            {
                new PersonModel()
                {
                    ID = intID,
                    FirstName = firstName
                }
            };
            TempData["Data"] = System.Text.Json.JsonSerializer.Serialize(data);
            return RedirectToAction("NewPage", "NewPage");
        }

Модель:

public class PersonModel
    {
        public int ID { get; set; }
        public string FirstName { get; set; }
    }

Вид:

<form asp-action="NewPage" method="get">
   <select name="dropdown1" asp-items="@(new SelectList(ViewBag.message, "ID", "FirstName"))"></select>
    <input id="Submit1" type="submit" value="submit" />
</form>

@section Scripts{
    <script>
        $(document).ready(function () {
            $("form").submit(function () {
                event.preventDefault();
                var text = $("select[name=dropdown1] option:selected").text();
                var val = $("select[name=dropdown1] option:selected").val();

                $.ajax({
                    type: 'Get',
                    url: '/NewPage?dropdown1=' + val + "&firstName=" + text,
                });
            })
        });

    </script>
}

Результат: введите описание изображения здесь

0 голосов
/ 14 июля 2020

У вас есть несколько вариантов

Если вы выполняете POST, то устанавливая для атрибута select NAME значение name = 'dropdown1', оно должно связывать выбранное значение.

Если ваша модель представления имеет одноименное свойство можно использовать asp -for. Вот элемент управления select, который я использую для отправки изменений в способе агрегирования данных. Обратите внимание, что дата от / до элементов управления будет привязана с использованием их asp - для значений атрибутов

<select class="form-control" asp-for="Aggregation"
        asp-area="Management"
        asp-controller="Visits"
        asp-action="Index"
        asp-route-sortcolumn="@Model.SortColumn"
        asp-route-sortorder="@(Model.SortDirection)"
        onchange="$('form').submit();">


    [HttpPost]
    public async Task<IActionResult> Index(string aggregation, DateTime dateFrom, DateTime dateTo, string sortColumn = "VisitDate", SortOrder sortOrder = SortOrder.Descending)
    {
        return View(await GetSiteVisitsViewModel(aggregation, dateFrom, dateTo, sortColumn, sortOrder));
    }
...