为EntityFramework下拉列表创建ViewModel

时间:2013-02-08 06:38:58

标签: c# asp.net-mvc entity-framework

我希望有一个下拉列表,不需要在控制器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; }

    }

1 个答案:

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