我是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);
}
答案 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)