Asp.net MVC & AJAX - PullRequest
       15

Asp.net MVC & AJAX

2 голосов
/ 19 марта 2019

У меня есть кнопка Ajax, которая всякий раз, когда я нажимаю на нее, показывает одну запись из базы данных (в моем контроллере я использовал .Take(1))

    public PartialViewResult BtnNext()
    {
        List<Queue> model = db.Queues.OrderBy(x => x.QueueNumber).Take(1).ToList();
        return PartialView("_queuenumber", model);
    }  

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

Интересно, возможно ли это вообще и какие вещи я должен использовать для этого?

Ответы [ 3 ]

2 голосов
/ 19 марта 2019

Да.Возможно.Просто установите Application ["counter"] = 0 в Application_Start , затем увеличьте значение на 1 в представлении результатов и используйте его для получения следующей записи.

    public PartialViewResult BtnNext()
    {
        List<Queue> model = db.Queues.OrderBy(x => x.QueueNumber).Skip(Application["counter"]).Take(1).ToList();
        Application["counter"] = Application["counter"] + 1;
        return PartialView("_queuenumber", model);
    }  
2 голосов
/ 19 марта 2019

Ссылка Используйте FormCollection, попробуйте следующий код.

public PartialViewResult BtnNext(FormCollection Form)
{
    Int32? Count = Convert.ToInt32(Form["Count"]??0);
    List<Queue> model = db.Queues.OrderBy(x => x.QueueNumber).ToList();
    model.ElementAt(count); //   [NotMapped]  public Int32? count { get; set; } add in model class
    model.count=count+1;
    return PartialView("_queuenumber", model);
} 

при просмотре

<input type="submit" class="btn btn-primary" value="Save" id="BtnNext">
<input type="hidden" id="Count" name="Count" value="@Model.Count" />
2 голосов
/ 19 марта 2019

Хорошей практикой, когда вы понимаете, что вашим представлениям необходимо обрабатывать и манипулировать вашими данными, является создание класса ViewModel, который охватывает все объекты, которые вам нужно отправить в это представление.В вашем случае вы можете начать с простого

public class QueueViewModel
{
    public Queue Queue { get; set ; }
    public int CurrentRecord { get; set ; }
}

Теперь все, что вам нужно сделать, это изменить метод действия контроллера, чтобы вы инициализировали и передали ViewModel в View.Также будет лучше иметь необязательный аргумент, действующий в качестве записи по умолчанию, а затем использовать команду linq Skip для перехода к конкретной записи:

Public PartialViewResult NextRecord(int current = 0)
{
    QueueViewModel model = new QueueViewModel();
    model.CurrentRecord = current;
    model.Queue = db.OrderBy(x => yourClause).Skip(current).Take(1);
    return PartialView(“yourview”, model);
}

Я изменил List<Queue> в пределахваша модель, как мне кажется, вам не нужен список, если вы показываете только одну запись за раз, но вы можете легко вернуться к дженерикам, если вы чувствуете, что вам действительно нужно.

Что касаетсяПосмотрите часть, где вы обрабатываете индекс модели, есть много способов достичь того же результата.Лично мне нравится использовать модель для заполнения атрибута data элемента DOM и использовать его в вызове Ajax.Поскольку теперь у вас есть

@model yourModelNamespace.QueueViewModel

, вы можете установить элемент (скажем, кнопку) для размещения значения current:

<button data-current-record=“@Model.CurrentRecord”>...</button>

Теперь вы можете очень легкополучить это значение в вашем Ajax-вызове для метода действия:

var currentRecord = parseInt($(‘button’).data()[currentRecord]);
$.ajax({
    url: yourPathToTheAction,
    type: ‘GET’,
    data: {
        current: currentRecord + 1
    }
});

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

...