c# - كيف يمكنني تطبيق عامل التصفية أثناء ترقيم الصفحات في Asp.net MVC وإطار عمل الكيان؟




asp.net-mvc entity-framework (2)

لدي تطبيق ويب مكتوب باستخدام ASP.NET MVC framework. لدي Homecontroller لدي إجراء يسمى Index والذي يستجيب لطلب Get . في هذا الإجراء ، أقوم بإنشاء صفحات باستخدام مكتبة IPagedList السجلات إلى صفحات متعددة. يبدو My [email protected] شيئًا كهذا

public ActionResult Index(int? id)
{
    using(var connection = new Context())
    {
        int pageNumber = (id ?? 1);
        var presenter = new Presenter
        {
            Presenter = pageNumber,
            Tasks = connection.Tasks.ToPagedList(pageNumber, 30),
            Form = new TasksFiltersViewModel()
        }

        return View(presenter);
    }
}

لدي أيضًا إجراء يسمى Index يستجيب لطلب Post الذي يطبق بعض المرشحات. حتى في طلب Post أفعل شيئا من هذا القبيل

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Index(Presenter model)
{
    int pageNumber = (id ?? 1);
    if (ModelState.IsValid)
    {
        using(var connection = new Context())
        {
            model.Tasks = connection.Tasks
                                    .Where(task => task.Status == 5)
                                    .ToPagedList(pageNumber, 30);
        }
    }

    return View(model);
}

يعمل هذا أيضًا بشكل جيد ما لم يغير المستخدم الصفحة ، ثم تبقى المرشحات في وضع الراحة.

هنا هو كيف تبدو فئة العرض التقديمي الخاصة بي

public class Presenter
{
    public IPagedList<Task> Tasks { get; set; }
    public TasksFiltersViewModel Form { get; set; }
    public int PageNumber { get; set; }
    public IEnumerable<SelectListItem> Statuses { get; set; }
}

كيف يمكنني السماح للمستخدمين باستخدام الصفحات مع الاحتفاظ بالمرشحات؟

هنا بلدي المرشحات VM

public class TasksFiltersViewModel
{
    public int Status { get; set; }
}

المنظر يشبه هذا

@using (Html.BeginForm("Index", "Tasks", FormMethod.Post, new { @class = "form-horizontal" }))
{
    @Html.AntiForgeryToken()

    <div class="form-group">
        @Html.LabelFor(m => m.Form.Status, new { @class = "control-label col-sm-3" })
        <div class="col-sm-9">
            @Html.DropDownListFor(m => m.Form.Status, Model.Statuses, new { @class = "form-control" })
            @Html.ValidationMessageFor(m => m.Form.Status, "", new { @class = "text-danger" })
        </div>

    </div>

    <div class="row">
        <div class="col-sm-9 col-md-push-3">
            <div>
                <button type="submit" class="btn btn-default">Filter</button>
            </div>
        </div>
    </div>

}

foreach (var task in Model.Tasks)
{
    <tr>
        <td>@task.Name</td>
        <td>@task.Type</td>
        <td>@Html.ActionLink("Edit", "Details", "Task", new { @id = task.Id }, new { @class = "btn btn-primary btn-sm" })</td>
    </tr>
}


@Html.PagedListPager(Model.Tasks, id => Url.Action("Index", new { id }))

أعتقد أن هناك طريقة أفضل يجب أن تعود إلى عرض المرشحات في ViewBag . يمكنك جعل شيء مثل أدناه:

@Html.PagedListPager(
Model.Tasks, id => 
Url.Action("Index", new { id, 
Status = ViewBag.Status , AnotherFilterValue = ViewBag.AnotherFilterValue, ...  }))

لكن ضع في اعتبارك اختبار ViewBag.Status للحصول على قيمة فارغة. إذا كان له قيمة ، فضعها في قائمة معلمات المسار ، ثم قم بتعيين ActionLink افتراضي.

ثم داخل إجراء POST ، تتوقع int لاغية كما يلي:

public ActionResult Index(int? id, int? status, ...)
{
    int pageNumber = (id ?? 1);
    if (ModelState.IsValid)
    {

    using(var connection = new Context())
    {
        if(status != null)
        {
          ViewBag.Status = status.value;
          model.Tasks = connection.Tasks
                                .Where(task => task.Status == status.value)
                                .ToPagedList(pageNumber, 30);
        }
        else
        {
           model.Tasks = connection.Tasks
                                  .ToPagedList(pageNumber, 30);
        }
      }
    }

   return View(model);
}

طريقتان للقيام بذلك.

الطريقة السريعة: ملفات تعريف الارتباط.

فقط قم بتعيين ملف تعريف ارتباط لخيارات التصفية. في الإجراءات التي تتطلب التصفية ، كل ما عليك القيام به هو قراءة ملفات تعريف الارتباط والتصفية وفقًا لذلك.
أنا لا أحب ملفات تعريف الارتباط وجلسات ، وأود تجنبها. لكن في بعض الأحيان يمكن أن يكون ما تحتاجه.

استخدام المعلمات GET

في المثال الخاص بك ، لقد استخدمت POST للتصفية. في كل مرة تقوم فيها بالنقر فوق أحد الارتباطات ، فإنه يطلق طلب GET وليس POST . لذلك لا يحدث التصفية. الجزء الصعب هو التأكد من تعيين المعلمات GET كل مرة. يمكن إنشاء ملحق مخصص مشابه لـ Html.Action() للبدء به. إذا كنت ستقوم بالتحقق من خيارات المرشح في إجراءات متعددة ، ففكر في استخدام Filter إجراء.





pagedlist