Подгрузить данные со следующей колонки AJAX (ASP.NET MVC)

288
29 марта 2017, 14:06

У меня есть таблица, собственно вод код

CREATE TABLE [dbo].[QuestionBlocks] (
[Block_ID]     INT            IDENTITY (1, 1) NOT NULL,
[Question1]    NVARCHAR (MAX) NULL,
[Question2]    NVARCHAR (MAX) NULL,
[Question3]    NVARCHAR (MAX) NULL,
[Question4]    NVARCHAR (MAX) NULL,
[Question5]    NVARCHAR (MAX) NULL,
[Question6]    NVARCHAR (MAX) NULL,
[Question7]    NVARCHAR (MAX) NULL,
[Question8]    NVARCHAR (MAX) NULL,
[Question9]    NVARCHAR (MAX) NULL,
[Question10]   NVARCHAR (MAX) NULL,
[Interview_Id] INT            NULL,
[QuestionId]   INT            NULL,
PRIMARY KEY CLUSTERED ([Block_ID] ASC),
CONSTRAINT [FK_QuestionBlocks_ToTable] FOREIGN KEY ([Interview_Id]) REFERENCES [dbo].[Interviews] ([Interview_Id]) ON DELETE CASCADE
);

Есть вьюха, где мне нужно светить вопросы эти в диве.

Я написал код для одного вопроса (Question1).

То есть какая логика.

Есть PartialView, вот код

@model IEnumerable<SmartSolutions.Models.QuestionBlock>
@foreach (var item in Model) {
    <div class="qustion-div-one">
        @Html.DisplayFor(modelItem => item.Question1)
    </div>
}

Код для контроллера

public ActionResult Recording(int id)
{
    /*var items = db.QuestionBlocks
            .Where(x => x.Interview_Id == id)
            .Select(x => x).ToList();*/
    ApplicationDbContext db = new ApplicationDbContext();
    return View();
}
public ActionResult QuestionBlock(int id) {
    ApplicationDbContext db = new ApplicationDbContext();
    var questionblocks = db.QuestionBlocks.Take(id);
    return PartialView(questionblocks);
}

И собственно код AJAX запроса

<script>
$(document).ready(function () {
    var full_url = document.URL; // Get current url
    var url_array = full_url.split('/') // Split the string into an array with / as separator
    var id = url_array[url_array.length - 1];  // Get the last part of the array (-1)
    alert(id);

    $.ajax({
        type: "GET",
        url: "/interwier/QuestionBlock",
        data: { id: id },
        success: function (data) {
            $("#questions").html(data);
        },
        error: function () {
            alert("Smth wrong in controller");
        }
    });
});
</script>

В чем моя проблема, по кнопке надо грузить в этот PartialView Question 2 и т.д

Как это реализовать? Спасибо!

Answer 1

Для того, чтобы рисовать на Вашей PartialView все ваши вопросы из таблицы QuestionBlocks нужно немного переписать код. Метод контроллера, который рисует основную страницу переписать так, чтобы в нее передавать подготовленный список.

Ваша основная загвоздка в том, что таблица в базе данных спроектирована некорректно. Внутри таблицы QuestionBlocks у Вас есть Question1, Question2, Question3, Question4, Question5, Question6, Question7, Question8, Question9, Question10 - все они столбцы таблицы. Было бы неплохо нормализовать таблицу и вынести Question в отдельную таблицу, чтобы у объекта QuestionBlock был список Question.

Но Ваш код можно переписать так, чтобы продемонстрировать как должно быть по-хорошему (но выглядит он ужасно) но без AJAX запроса. Метод контроллера, который рисует основную страницу перепишем так:

public ActionResult Recording(int id)
{
    List<string> lst = new List<string>();
    ApplicationDbContext db = new ApplicationDbContext();
    var item = db.QuestionBlocks.FirstOrDefault(x => x.Interview_Id == id);
    if(item != null)
    {
        lst.Add(item.Question1);
        lst.Add(item.Question2);
        lst.Add(item.Question3);
        lst.Add(item.Question4);
        lst.Add(item.Question5);
        lst.Add(item.Question6);
        lst.Add(item.Question7);
        lst.Add(item.Question8);
        lst.Add(item.Question9);
        lst.Add(item.Question10);            
    }
    return View(lst);
}

Таким образом на Вашей основной странице будет не пустая модель:

@model List<string>

Список этих вопросов будем передавать на PartialView в Вашей основной странице как-то так:

@Html.Partial(/*Ваша PartialView*/, Model)

Теперь перейдем далее, к Вашей PartialView, на ней у Вас уже есть модель, тут изменения тоже будут, хотите рисовать в одном блоке - вынесите его за пределы цикла foreach. Итак, что будет на странице:

@model List<string>
<div class="qustion-div-one">
    @foreach (var item in Model) {
        @Html.DisplayFor(modelItem => item)
    }
</div>

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

Второй вариант (менее затратный). Просто перепишем Вашу PartialView вот так, чтобы при клике на кнопку у Вас отобразились все Questions:

@model IEnumerable<SmartSolutions.Models.QuestionBlock>
@foreach (var item in Model) {
    <div class="qustion-div-one">
        @Html.DisplayFor(modelItem => item.Question1)
        @Html.DisplayFor(modelItem => item.Question2)
        @Html.DisplayFor(modelItem => item.Question3)
        @Html.DisplayFor(modelItem => item.Question4)
        @Html.DisplayFor(modelItem => item.Question5)
        @Html.DisplayFor(modelItem => item.Question6)
        @Html.DisplayFor(modelItem => item.Question7)
        @Html.DisplayFor(modelItem => item.Question8)
        @Html.DisplayFor(modelItem => item.Question9)
        @Html.DisplayFor(modelItem => item.Question10)
    </div>
}

Для того, чтобы рисовать каждый новый Question при клике на кнопку - нужно менять концепцию модели данных. Текущая модель не подходит, придется много писать некрасивого кода. Если будет список однотипных значений - то будет проще. На данном этапе завершаю ответ, так как логика для отображения новых значений при клике пока такая: внутрь обработчика вешать проверку на то, какой блок был нарисован (к примеру храним идентификатор в переменной) и в зависимости от этого переходить к рисованию следующего, причем это будет происходить динамически в JavaScript.

К примеру если будет массив строк в качестве модели на основной странице, то будет следующее:

Объявим переменную на странице:

@{
    var indexQuestion = 0; // в начале первый элемент
}

А в JavaScript будет обработчик нажатия кнопки:

$(document).ready(function () {
    // предположим что у нее идентификатор btn   
    $('#btn').click(function () {
        if(@indexQuestion < 10) // знаем, что элементов десять
        {
            var input = document.createElement('input'); 
            input.type = "text"; 
            // берем значение и делаем инкремент
            input.value = '@Model[indexQuestion++]';
            // в блок questions добавим новый элемент
            document.getElementbyId('questions').appendChild(input);
        }
    }
}

В таком случае PartialView уже не будет нужна для рисования и тут снова без AJAX. Просто в Вашем вопросе достаточно странная логика, которая до конца не продумана, даже если продумана, то необходимые данные и код для этого не подготовлены.

READ ALSO
Хеширование SHA1

Хеширование SHA1

В сети нашел интересную реализацию хеширование с использованием класса sha1Все что нужно для шифрования и дешифрования, так это вот этот метод

241
C# запись в Exel-файл. Независимость от версий Microsoft Office

C# запись в Exel-файл. Независимость от версий Microsoft Office

Нужно записать данные в таблицу ексельДелаю вот так:

262
400 bad request php

400 bad request php

Хочу отправить запрос, на создание поста в группе вк, вчера буквально работал, сейчас выдает 400 bad requestСамое главное, что если вывожу переменную...

323