如何不丢失在ASP MVC 3中填充DropDownList的集合?

时间:2011-05-04 10:35:53

标签: c# asp.net asp.net-mvc-3

我是ASP MVC 3的新手,我有以下问题。我有一个表单,它向自己发出一个post请求,以便向服务器发送数据。表单包含Sales People的DropDownList,此列表从数据库填充。主要动作如下:

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视图中,当我提交表单时,SalesPeople列表设置为null(在Index HttpPost方法中),我想显示相同的视图,列表仍然填充。然而,要做到这一点,我将不得不再次查询数据库。避免这样做的最佳做法是什么?

编辑:

我的POST索引moethod代码是这样的:

[HttpPost]
public ActionResult Index(OrderSearchViewModel viewModel)
{
   var result = QueryOrders(viewModel);
   //code update the model with the results
   return View(viewModel);
}

3 个答案:

答案 0 :(得分:0)

使用Ajax提交表单,然后使用json将post操作的结果返回给客户端 - 这样,数据库就不会对该列表进行两次点击,用户也可以获得更流畅的体验。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您的OrderSearchViewModel中不应该有SalesPeople集合,因为它违反了单一责任原则。您应该覆盖EditorTemplate for SalesPersonId并创建单独的操作,该操作将负责填充下拉列表。

以下是我的应用程序中的代码,您可以将其用作示例。请注意,我的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));}

Category.List行动:

    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)