在控制器的操作中使用相同的模型数据

时间:2015-04-15 07:47:24

标签: c# asp.net-mvc asp.net-mvc-4

我有一个控制器和两个动作。

在我的Products行动中,我正在填写我的收藏品。然后当我调用Index操作时,再次调用ProductManager.ReadProducts()方法。

我不想在第二次动作呼叫时连接到数据库。

public class ProductController : Controller
{
    public List<Product> ProductsList = ProductManager.ReadProducts();

    public ActionResult Index(long Id)
    {
        return View(ProductsList.FirstOrDefault(x => x.Id == Id));
    }

    public ActionResult Products()
    {
        return PartialView(ProductsList);
    }
}

2 个答案:

答案 0 :(得分:4)

正如@ stephen-muecke所提到的,你有很少的解决方案

解决方案1: Session 但请注意会话是按用户划分的。如果您的产品是用户特定的,您可以使用它。

public class ProductController : Controller
{
    public List<Product> ProductsList {
            get { 
                var products = (Session["ProductsList"] as List<Product>);
                if(products == null)
                {
                    products = ProductManager.ReadProducts();
                    Session["ProductsList"] = products;
                }

                return products;
            }
        }

    // actions
}

解决方案2: Caching 适用于所有用户,如果您的产品适用于您为所有用户存储在一个位置的所有用户。< / p>

public class ProductController : Controller
{
    public List<Product> ProductsList {
            get { 
                var products = (HttpRuntime.Cache["ProductsList"] as List<Product>);
                if(products == null)
                {
                    products = ProductManager.ReadProducts();
                    HttpRuntime.Cache["ProductsList"] = products;
                }

                return products;
            }
        }

    // actions
}

解决方案3 :您可以使用 OutputCache 来缓存操作的输出。

public class ProductController : Controller
{
    public List<Product> ProductsList = ProductManager.ReadProducts();

    [OutputCache(Duration=60, VaryByParam="*")] 
    public ActionResult Index(long Id)
    {
        return View(ProductsList.FirstOrDefault(x => x.Id == Id));
    }

    [OutputCache(Duration=60, VaryByParam="none")]
    public ActionResult Products()
    {
        return PartialView(ProductsList);
    }
}

答案 1 :(得分:2)

使用其中一个共享容器,例如Session

public class ProductController : Controller
{
    public ActionResult Index(long Id)
    {
        return View(GetProductList().FirstOrDefault(x => x.Id == Id));
    }

    public ActionResult Products()
    {
        return PartialView(GetProductList());
    }

    private IList<Product> GetProductList()
    {
        var productList = Session["ProductsList"];

        if (productList != null)
        {
            return productList;
        }

        productList = ProductManager.ReadProducts();
        Session["ProductsList"] = productList;

        return productList;
    }
}