如何在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);
}
使用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)