首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >@Html.DropDownListFor和@HtmlPagedListPager

@Html.DropDownListFor和@HtmlPagedListPager
EN

Stack Overflow用户
提问于 2015-07-07 14:14:08
回答 2查看 832关注 0票数 0

我使用VS2013创建了一个MVC网站。我的视图包含一个用于"Import“的下拉列表和一个分页控件,如下所示:

我的意见如下:

代码语言:javascript
复制
@model PagedList.IPagedList<ESBAMPortal.Models.SupplierStockUpdateViewModel>
@using PagedList.Mvc;
<link href="~/Content/PagedList.css" rel="stylesheet"
      type="text/css" />
@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";
    SelectList itemsPerPageList = ESBAMPortal.Helpers.DefaultValues.ItemsPerPageList;
}

<h2>Stock Updates</h2>

<div class="container-fluid">
    <div class="row">
        <div id="instruction" class="col-md-6 pull-left">
            <h5>Click the 'Process Start' datetime to see a copy of the file received</h5>
        </div>
    </div>
    <div class="row" id="filters">
        <div id="filtersDropdown" class="col-md-6 pull-right">
            @using (Html.BeginForm("Index", "SupplierStockUpdate", FormMethod.Get, new { @class = "pull-right" }))
            {
                {
                    <span>
                        @Html.Label("Import Status:")
                        @Html.DropDownListFor(m => m.FirstOrDefault().SelectedStatusId, Model.FirstOrDefault().StatusItems)
                     </span>
                    <span>
                        @Html.Label("Items per page:")
                        @Html.DropDownList("ItemsPerPage", itemsPerPageList,
                            new { @id = "ItemsPerPageList" })
                    </span>
                }
                <input type="submit" value="Refresh" />
            }
        </div>
    </div>
</div>

<table class="table table-striped">
    <thead>
        <tr>
            <th>@Html.DisplayNameFor(model => model.FirstOrDefault().ReceivedFilename)</th>
            <th>@Html.ActionLink("Proces Start", "Index", new { sortOrder = ViewBag.TimeReceivedSort, itemsPerPage = itemsPerPageList.SelectedValue })</th>
            <th>@Html.DisplayNameFor(model => model.FirstOrDefault().TimeProductLookupResponse)</th>
            <th>@Html.DisplayNameFor(model => model.FirstOrDefault().TimeInsertResponse)</th>
            <th>@Html.DisplayNameFor(model => model.FirstOrDefault().ImportStatus)</th>
            <th>@Html.DisplayNameFor(model => model.FirstOrDefault().ImportErrors)</th>
            <th>@Html.ActionLink("Supplier", "Index", new { sortOrder = ViewBag.SupplierSort })</th>
            <th>@Html.DisplayNameFor(model => model.FirstOrDefault().RowsInserted)</th>

            <th>@Html.DisplayNameFor(model => model.FirstOrDefault().TimeOfExceptionString)</th>
        </tr>
    </thead>

    <tbody>
        @foreach (var item in Model)
        {

            <tr>
                <td>@Html.DisplayFor(model => item.ReceivedFilename)</td>
                <td>
                    @Html.ActionLink(item.TimeReceived.ToString(), "Index", "ArchivedMsg",
                        new { interchangeId = item.InterchangeId }, null)
                </td>
                <td>@Html.DisplayFor(model => item.TimeProductLookupResponse)</td>
                <td>@Html.DisplayFor(model => item.TimeInsertResponse)</td>
                <td>@Html.DisplayFor(model => item.ImportStatus)</td>
                <td>@Html.DisplayFor(model => item.ImportErrors)</td>
                <td>@Html.DisplayFor(model => item.SupplierCode)</td>
                <td>@Html.DisplayFor(model => item.RowsInserted)</td>
                @{

            if (item.TimeOfExceptionString.IsDateTime())
            {
                <td>@Html.ActionLink(item.TimeOfExceptionString, "IndexForInterchangeId", "Fault", new { interchangeId = item.InterchangeId }, null) </td>
            }
            else
            {
                <td>NA</td>
            }
                }
            </tr>
        }
    </tbody>
</table>

<div id="pageControllFooter" class="container-fluid">
    <div class="row">
        <div id="pageButtons" class="col-md-2">
            @Html.PagedListPager(Model, page => Url.Action("Index", new { page, itemsPerPage = ViewBag.CurrentItemsPerPage }))
        </div>
    </div>
    <div class="row">
        <div id="pageDesc" class="col-md-2">
            @if (Model != null
                    && Model.PageCount > 0)
            {
                <div>
                    Page @(Model.PageCount < Model.PageNumber
                     ? 0 : Model.PageNumber)
                    of @Model.PageCount
                </div>
            }
        </div>

    </div>
</div>

型号:

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace ESBAMPortal.Models
{
    public class SupplierStockUpdateViewModel
    {
        public string ActivityID { get; set; }
        public string InterchangeId { get; set; }

        [DisplayName("Received")]
        public DateTime? TimeReceived { get; set; }
        [DisplayName("DW Product Requested")]
        public DateTime? TimeProductLookupRequested { get; set; }
        [DisplayName("DW Product Response")]
        public DateTime? TimeProductLookupResponse { get; set; }
        [DisplayName("CIMS Insert Requested")]
        public DateTime? TimeInsertRequested { get; set; }
        [DisplayName("CIMS Insert Response")]
        public DateTime? TimeInsertResponse { get; set; }
        [DisplayName("Supplier Code")]
        public string SupplierCode { get; set; }
        [DisplayName("CIMS Records Updated")]
        public int? RowsInserted { get; set; }
        public string ReceivedFilename { get; set; }
        public DateTime? TimeOfException { get; set; }
        public string TimeOfExceptionString { get; set; }
        public double TotalDuration { get; set; }
        public string ImportStatus { get; set; }
        public int? ImportErrors { get; set; }
        public DateTime LastModified { get; set; }

        //constructor
        public SupplierStockUpdateViewModel()
        {
            _statuses = new List<Status>();

            _statuses.Add(new Status()
            {
                Id = 1,
                Name = "All"
            });

            _statuses.Add(new Status()
            {
                Id = 2,
                Name = "Pending"
            });

            _statuses.Add(new Status()
            {
                Id = 3,
                Name = "Complete"
            });

        }

        private readonly List<Status> _statuses;

        public class Status
        {
            public int Id { get; set; }
            public string Name { get; set; }
        }

        [Display(Name = "Status")]
        public int SelectedStatusId { get; set; }

        //our VM has a select list
        public IEnumerable<SelectListItem> StatusItems
        {
            get { return new SelectList(_statuses, "Id", "Name"); }
        }
    }

}

主计长:

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using ESBAMPortal.DataLayer;
using ESBAMPortal.Models;
using PagedList;
using ESBAMPortal.DomainClasses.BAM;
using System.IO;

namespace ESBAMPortal.Controllers
{
    public class SupplierStockUpdateController : Controller
    {
        private IRepository<SupplierStockUpdate> SupplierStockUpdateRepository;

        public SupplierStockUpdateController(BAMContext context)
        {
            this.SupplierStockUpdateRepository = new EFRepository<SupplierStockUpdate>(context);
        }

        private string TranslateStatusFilter(int status)
        {
            string ret = "";

            switch (status)
            {
                case 2:
                    ret = "Pending";
                    break;
                case 3:
                    ret = "Complete";
                    break;
            }

            return ret;

        }

        // GET: /SupplierStock/
        public ActionResult Index(string sortOrder, int? page, int? itemsPerPage, SupplierStockUpdateViewModel vm)
        {

            string statusFilter = TranslateStatusFilter(vm.SelectedStatusId);

            ViewBag.CurrentItemsPerPage = itemsPerPage;
            ViewBag.TimeReceivedSort = String.IsNullOrEmpty(sortOrder) ? "timeReceived" : "";
            ViewBag.SupplierSort = sortOrder == "supplier" ? "supplier_desc" : "supplier";

            var query = this.SupplierStockUpdateRepository.GetAll();
            switch (sortOrder)
            {
                case "timeReceived":
                    query = query.OrderBy(f => f.TimeReceived);
                    break;
                case "supplier":
                    query = query.OrderBy(f => f.SupplierCode);
                    break;
                case "supplier_desc":
                    query = query.OrderByDescending(f => f.SupplierCode);
                    break;
                default:
                    query = query.OrderByDescending(f => f.TimeReceived);
                    break;
            }

            if (statusFilter == "Pending" || statusFilter == "Complete")
            {
                query = query.Where(x => x.ImportStatus == statusFilter);
            }

            //shove results into view model
            List<SupplierStockUpdateViewModel> SupplierStockUpdatesVM = new List<SupplierStockUpdateViewModel>();

            DateTime start = new DateTime();
            DateTime end = new DateTime();

            foreach (var item in query.ToList())
            {
                SupplierStockUpdateViewModel SupplierStockUpdateVM = new SupplierStockUpdateViewModel();

                SupplierStockUpdateVM.ActivityID = item.ActivityID;
                SupplierStockUpdateVM.InterchangeId = item.InterchangeId;
                SupplierStockUpdateVM.TimeReceived = item.TimeReceived;
                SupplierStockUpdateVM.TimeProductLookupRequested = item.TimeProductLookupRequested;
                SupplierStockUpdateVM.TimeProductLookupResponse = item.TimeProductLookupResponse;
                SupplierStockUpdateVM.TimeInsertRequested = item.TimeInsertRequested;
                SupplierStockUpdateVM.TimeInsertResponse = item.TimeInsertResponse;
                SupplierStockUpdateVM.SupplierCode = item.SupplierCode;
                SupplierStockUpdateVM.RowsInserted = item.RowsInserted;
                SupplierStockUpdateVM.TimeOfException = item.TimeOfException;
                SupplierStockUpdateVM.ReceivedFilename = item.ReceivedFilename;
                SupplierStockUpdateVM.ImportStatus = item.ImportStatus;
                SupplierStockUpdateVM.ImportErrors = item.ImportErrors;

                start = (item.TimeReceived == null) ? DateTime.MinValue : (System.DateTime)item.TimeReceived;

                if (item.TimeOfException == null)
                {
                    SupplierStockUpdateVM.TimeOfExceptionString = "NA";
                    if (item.TimeInsertResponse != null)
                    {
                        end = (System.DateTime)item.TimeInsertResponse;
                    }
                    else
                    {
                        //no exception but process still running so give a duration of 0
                        end = start;
                    }
                }
                else
                {
                    SupplierStockUpdateVM.TimeOfExceptionString = item.TimeOfException.ToString();
                    end = (System.DateTime)item.TimeOfException;
                }

                if (start == DateTime.MinValue)
                {
                    SupplierStockUpdateVM.TotalDuration = 0;
                }
                else
                {
                    SupplierStockUpdateVM.TotalDuration = (end - start).TotalSeconds;
                }

                SupplierStockUpdatesVM.Add(SupplierStockUpdateVM);
            }

            int pageSize = (itemsPerPage ?? 10);
            int pageNumber = (page ?? 1);

            return View(SupplierStockUpdatesVM.ToPagedList(pageNumber, pageSize));
        }
    }
}

单击“刷新”按钮“所有工作正常”,过滤导入状态将传递给控制器。我的问题是,当通过单击页面控件的框分页时,值0总是在VM.SelectedStatusId字段中传递的。

我尝试将视图的调用更改为显式传递SelectedStatusId,如下所示:

代码语言:javascript
复制
@Html.PagedListPager(Model, page => Url.Action("Index", new { page, itemsPerPage = ViewBag.CurrentItemsPerPage, Model.FirstOrDefault().SelectedStatusId }))

...and在控制器操作上添加了一个对应的int,但这仍然是0。

有人能告诉我我哪里出了问题吗?谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-10 15:17:37

当用户单击视图上的“刷新”按钮时,vm.SelectedStatusId将传递到操作中。

在控制器的Index操作中,我将选定的状态分配给viewbag属性:

代码语言:javascript
复制
ViewBag.StatusId = vm.SelectedStatusId;

当用户稍后分页查看结果时,我将从view袋传入先前选择的状态筛选器:

代码语言:javascript
复制
 @Html.PagedListPager(Model, page => Url.Action("Index", new { page, itemsPerPage = ViewBag.CurrentItemsPerPage, selectedStatusId = ViewBag.StatusId }))
票数 0
EN

Stack Overflow用户

发布于 2015-07-07 18:44:43

第一次看,你似乎把下面的代码写错了。

代码语言:javascript
复制
    @Html.PagedListPager(Model, page => Url.Action("Index", new { page, itemsPerPage = ViewBag.CurrentItemsPerPage, Model.FirstOrDefault().SelectedStatusId }))

您忘记了表达式中最后一个参数的返回参数。尝试以下几点

代码语言:javascript
复制
    @Html.PagedListPager(Model, page => Url.Action("Index", new { page, itemsPerPage = ViewBag.CurrentItemsPerPage, vm = Model.FirstOrDefault().SelectedStatusId }))

注意"vm =“

如果成功的话请告诉我!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31271073

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档