Заполните раскрывающийся список в MVC данными API

Я относительно новичок в MVC и все еще в замешательстве, поэтому мне нужна помощь с проблемой.

Я создал консольное приложение веб-парсера, в котором я сравниваю две статьи (где я извлекаю данные из определенного API), теперь я хочу сделать это проектом MVC, где у меня есть два раскрывающихся списка, которые необходимо заполнить данными из приведенного выше -упомянутый API, чтобы я мог сравнить две статьи.

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

Заранее спасибо!

Изменить: примерно так: приложение MVC


person wizardress    schedule 26.03.2019    source источник
comment
Прочитайте это, если вы хотите заполнить данные с вашего контроллера: tutorialsteacher.com/mvc/. Прочтите эту ссылку, если вы хотите использовать AJAX для заполнения раскрывающегося списка: c-sharpcorner.com/article/population-dropown-with-ajax-call   -  person Rahul Sharma    schedule 26.03.2019


Ответы (1)


Один из способов заполнить выпадающие списки — использовать ViewData.

Предположим, что ваши вызовы API находятся в отдельной службе. API должен будет вернуть список. В этом примере список будет иметь пользовательский класс: List<CustomClass>. Предположим, что ваш пользовательский класс содержит свойство Id и свойство Name. Ваш контроллер будет выглядеть так:

public class HomeController : Controller
{
    private readonly IApiService _apiService;

    public HomeController(
        IApiService apiService)
    {
        _apiService = apiService;
    }

    public IActionResult Index()
    {
        // Get the data from the API into the ViewData
        // In this example, Id will be the Id of the dropdown option,
        // and the Name will be what's displayed to the user

        ViewData["DataFromArticle1"] = new SelectList(
                await _apiService.GetDataFromArticle1Async(), 
                "Id", "Name");

        ViewData["DataFromArticle2"] = new SelectList(
                await _apiService.GetDataFromArticle2Async(), 
                "Id", "Name");

        return View();
    }
}

Теперь, чтобы заполнить раскрывающиеся списки в вашем представлении:

<select asp-items="ViewBag.DataFromArticle1"></select>
<select asp-items="ViewBag.DataFromArticle2"></select>

ОБНОВЛЕНИЕ

Следующий код будет вызывать вашу конечную точку API с помощью AJAX. Мы предполагаем, что вы создали WebApi и что в вашем WebAPI у вас есть ArticleDataController с методом под названием GetDataFromArticle1.

Ваше мнение:

<select id="dataFromArticle1"></select>

Ваш JavaScript:

$(document).ready(function () {  
    $.ajax({  
        type: "GET",  
        url: "/api/ArticleData/GetDataFromArticle1",   
        success: function (data) {  
            var s = '<option value="-1">Please Select a Department</option>';  
            for (var i = 0; i < data.length; i++) {  
                s += '<option value="' + data[i].Id+ '">' + data[i].Name + '</option>';  
            }  
            $("#dataFromArticle1").html(s);  
        }  
    });  
});  
person MarioMendieta    schedule 26.03.2019
comment
Я обновил свой вопрос изображением того, что должно делать приложение. Теперь у меня есть два вопроса: результат сравниваемых статей должен исходить и от API. Нужно ли мне создавать две отдельные веб-службы или мне следует поместить весь код из консольного приложения в веб-службу? - person wizardress; 28.03.2019
comment
В своем вопросе вы упоминаете, что у вас уже есть API, который ваше консольное приложение вызывает для (1) получения данных и (2) их сравнения. В моем примере ApiService позаботится о вызове вашего API для различных задач (например, получение данных, сравнение данных и т. д.). Я не знаю, как ваше консольное приложение вызывает API, но я рекомендую вам поместите код, который вызывает ваш API, в ApiService. Идея здесь состоит в том, чтобы разделить проблемы внутри вашего проекта (вашему контроллеру все равно, как вы получаете данные или как вы их сравниваете, его заботит только то, что данные есть). - person MarioMendieta; 28.03.2019
comment
Спасибо за объяснение, некоторые вещи стали намного понятнее, я буду следовать вашим инструкциям и дам вам знать, как это происходит. Спасибо еще раз! - person wizardress; 28.03.2019
comment
Рад помочь и добро пожаловать в Stack Overflow. Если этот или любой другой ответ решил вашу проблему, отметьте его как принятый. - person MarioMendieta; 28.03.2019
comment
Могу ли я решить эту проблему, используя вместо этого вызов ajax? - person wizardress; 29.03.2019
comment
Да, вы можете вызывать свой API с помощью AJAX. Взгляните на этот пример: c-sharpcorner.com/ статья/заполнение раскрывающегося списка с помощью ajax-вызова - person MarioMendieta; 29.03.2019
comment
Я посмотрел на этот конкретный пример, но он передает данные из базы данных. Что я должен поставить вместо сущностей базы данных? - person wizardress; 29.03.2019
comment
Пожалуйста, взгляните на мой обновленный ответ. Чтобы вызвать ваш API из AJAX, вам сначала нужно создать WebAPI. Этот WebAPI будет содержать тот же код из вашего консольного приложения для получения данных статьи. - person MarioMendieta; 29.03.2019
comment
Вот я снова, я пытаюсь сделать это другим способом с чем-то, что я понимаю больше. Если я получу данные из API и сериализую их (в контроллере), могу ли я передать те же значения в представлении, и как я могу сделать это, как получить доступ к данным json в контроллере и использовать их в представлении? Я знаю, как заполнить выпадающие списки данными json, но эта штука с MVC меня полностью ставит в тупик... - person wizardress; 03.04.2019
comment
Я бы порекомендовал вам опубликовать еще один вопрос и отправить мне ссылку. На самом деле рекомендуется задавать только один вопрос в сообщении, см.: meta.stackexchange.com/a/222741. - person MarioMendieta; 03.04.2019
comment
Ой, извините, я этого не знал, буду иметь в виду, спасибо! Вот еще один вопрос stackoverflow.com/questions/55495005/ . - person wizardress; 03.04.2019