我希望有一个下拉列表,不需要在控制器POST部分中查询数据库,以获取下拉列表选择的ID,以便可以将其作为外键放在表中。我不明白如何在不需要进行查询的情况下关闭它。如果有意义的话,我希望实体框架能够为它做繁重的工作吗?这可能吗?
public class BillRate
{
public BillRate()
{
this.BillRateTickets = new List<Ticket>();
}
public long BillRateID { get; set; }
public decimal TicketBillRate { get; set; }
public virtual ICollection<Ticket> BillRateTickets { get; set; }
}
public class Ticket
{
public long TicketID { get; set; }
public virtual BillRate BillRate { get; set; }
}
答案 0 :(得分:1)
目前尚不清楚你究竟是什么意思。如果您不查询数据库,您认为下拉列表中显示的项目将来自何处?它们将定义不会来自视图,因为在HTML中提交包含<select>
元素的表单时,只会将所选值发送到服务器。永远不会发送集合值,因此ASP.NET MVC无法为您创建这些值。
如果您想避免命中数据库,可以将此列表存储到缓存中,在POST操作中尝试首先查找缓存中的值。但是这些值必须保留在服务器的某个位置。所以你可以有一个方法首先在缓存中查找值,如果没有找到则查询数据库:
private IEnumerable<Ticket> GetTickets()
{
// Try to get the tickets from the cache first:
var tickets = MemoryCache.Default["tickets"] as IEnumerable<Ticket>;
if (tickets == null)
{
// not found in cache, let's fetch them from the database:
tickets = db.Tickets.ToList();
// and now store them into the cache so that next time they will be available
MemoryCache.Default.Add("tickets", tickets, new CacheItemPolicy { Priority = CacheItemPriority.NotRemovable });
}
return tickets;
}
然后您可以执行2个控制器操作:
public ActionResult Index()
{
var model = new BillRate();
model.BillRateTickets = GetTickets();
return View(model);
}
[HttpPost]
public ActionResult Index(BillRate model)
{
model.BillRateTickets = GetTickets();
return View(model);
}