如何在asp.net MVC 3中不丢失填充下拉列表的集合

本文关键字:填充 下拉列表 集合 asp net MVC | 更新日期: 2023-09-27 17:54:31

我是ASP MVC 3的新手,我有以下问题。我有一个表单,使post请求自己发送数据到服务器。该表单包含销售人员的下拉列表,该列表是从数据库中填充的。主要操作如下所示:

public ActionResult Index()
{
    var viewModel = new OrderSearchViewModel();
    viewModel.SalesPeople = GetSalesPeopleList(); // This queries the DB
    return View(viewModel);
}

和ViewModel看起来像这样:

public class OrderSearchViewModel
{
        public string Id { get; set; }
        public DateTime? StartDate { get; set; }
        public DateTime? EndDate { get; set; }
        public string PostCode { get; set; }
        public int SalesPersonId { get; set; }
        public string SalesPersonRef { get; set; }
        public int OrderType { get; set; }
        public string SerialNo { get; set; }
        public string CustomerPO { get; set; }
        public List<SalesPerson> SalesPeople { get; set; }
}

因此,在Index视图中,当我提交表单时,sales列表被设置为null(在Index HttpPost方法中),并且我想显示仍然填充列表的相同视图。然而,要做到这一点,我必须再次查询数据库。避免这种情况的最佳实践是什么?

编辑:

我的POST Index方法代码是这样的:
[HttpPost]
public ActionResult Index(OrderSearchViewModel viewModel)
{
   var result = QueryOrders(viewModel);
   //code update the model with the results
   return View(viewModel);
}

如何在asp.net MVC 3中不丢失填充下拉列表的集合

使用Ajax提交表单,并使用json将post操作的结果返回给客户端-这样数据库就不会因为该列表而被击中两次,用户也获得了更流畅的体验。

POST Index方法应该从FormCollection中获取销售人员的所有值。您总是可以使用Request。用于查询所有表单数据。另一种选择是你的某种缓存DB数据:)。无论如何,请附上您的POST索引方法的代码

在OrderSearchViewModel中不应该有sales集合,因为它违反了单一职责原则。您应该为SalesPersonId重写EditorTemplate并创建单独的操作,它将负责填充下拉列表。

这是我的应用程序的代码,您可以使用它作为示例。注意,我的CategoryId属性有Guid类型-你应该替换Guid?int ?。

使用mvcextensions覆盖模板:

    public class CreateAccidentCommandMetadata : ModelMetadataConfiguration<CreateAccidentCommand>
{
    public CreateAccidentCommandMetadata()
    {
        Configure(x => x.TrackingNumber)
            .Required();
        Configure(x => x.CategoryId)
            .Required()
            .DisplayName("Category")
            .Template(MVC.Accident.Views.EditorTemplates.Category);
    }
}
模板内容:

@model Guid?
@{Html.RenderAction(MVC.Category.List(ViewData.ModelMetadata, Model));}

类别。列出行动:

    public virtual ActionResult List(ModelMetadata modelMetadata, Guid? selected)
    {
        ViewData.Model = queryService.GetList(new GetCategoryListQueryContext())
            .Select(x => new SelectListItem
                             {
                                 Text = x.Name,
                                 Value = x.Id.ToString(),
                                 Selected = selected.HasValue && x.Id == selected
                             })
            .ToList();
        //it is important to set up ModelMetadata after model
        ViewData.ModelMetadata = modelMetadata;
        return View();
    }

和非常简单的视图:

@model IEnumerable<SelectListItem>
@Html.DropDownList(ViewData.ModelMetadata.PropertyName, Model)