0

我想要一个不需要在控制器 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; }

    }
4

1 回答 1

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);
}
于 2013-02-08T07:27:18.383 回答