C# 如何在_Layout.cshtml中呈现SQL server上数据库中的类别

C# 如何在_Layout.cshtml中呈现SQL server上数据库中的类别,c#,html,asp.net-mvc,twitter-bootstrap,session,C#,Html,Asp.net Mvc,Twitter Bootstrap,Session,我试图在我的

我试图在我的
主页上的
SQL
上显示数据库中的类别,如何做到这一点? 我的
\u Layout.cshtml
中有这个:

<div class="list-group">
                    <a href="#" class="list-group-item">Category 1</a>
                    <a href="#" class="list-group-item">Category 2</a>
                    <a href="#" class="list-group-item">Category 3</a>
                </div>
@model IEnumerable<MVCOnlineShop.Models.Category>

@{
    ViewBag.Title = "Store";
}
<h3>Browse Categories</h3>
<p>
    Select from @Model.Count()
    Categories:
</p>
<ul>
    @foreach (var Category in Model)
    {

        <li>
            @Html.ActionLink(Category.CategoryName,
"Browse", new { Category = Category.CategoryName })
    </li>
    }
</ul>
这是我的
StoreController

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using MVCOnlineShop.Models;

namespace MVCOnlineShop.Controllers
{
    public class StoreController : Controller
    {
        OnlineStoreEntities storeDB = new OnlineStoreEntities();
        //
        // GET: /Store/

        public ActionResult Index()
        {
            var Categories = storeDB.Categories.ToList();
            return View(Categories);
        }
        //
        // GET: /Store/Browse
        public ActionResult Browse(string Category)
        {
            // Retrieve Category and its Associated Products from database
            var CategoryModel = storeDB.Categories.Include("Products")
                .Single(g => g.CategoryName == Category);

            return View(CategoryModel);
        }
        //
        // GET: /Store/Details
        public ActionResult Details(int id)
        {
            var Product = storeDB.Products.Find(id);

            return View(Product);
        }
        //
        // GET: /Store/Browse?Category=Games

    }
}
这是我的
Global.asax

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;

namespace MVCOnlineShop
{
    // Note: For instructions on enabling IIS6 or IIS7 classic mode, 
    // visit http://go.microsoft.com/?LinkId=9394801

    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {


            WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            AuthConfig.RegisterAuth();
        }
    }
}

一种方法是使用sessionvar

在您的Global.asax.cs中:

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        AuthConfig.RegisterAuth();
    }

    protected void Session_Start()
    {
        // 'using' will call entity.Dispose() at the end of the block so you
        // don't have to bother about disposing your entity
        using(OnlineStoreEntities entity = new OnlineStoreEntities()){
            HttpContext context = HttpContext.Current;
            if(context != null && context.Session != null)
                // fill the Session var with the Categories from your database
                context.Session["Categories"] = entity.Categories.ToList();
        }
    }
}
@using MVCOnlineShop.Models;

@*[anything you want here]*@

@{
    // stores the Session content in a var
    var Categories = Session["Categories"] as List<Category>;
}

@*Checks if the Session variable is correct*@
@if(Categories != null){
    <ul>
        @*For each category in the Session var, display the link*@
        @foreach(var Category in Categories){
            <li>
                @Html.ActionLink(Category.CategoryName, "Browse", new { Category = Category.CategoryName })
            </li>
        }
    </ul>
}
在您的\u layout.cshtml中:

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        AuthConfig.RegisterAuth();
    }

    protected void Session_Start()
    {
        // 'using' will call entity.Dispose() at the end of the block so you
        // don't have to bother about disposing your entity
        using(OnlineStoreEntities entity = new OnlineStoreEntities()){
            HttpContext context = HttpContext.Current;
            if(context != null && context.Session != null)
                // fill the Session var with the Categories from your database
                context.Session["Categories"] = entity.Categories.ToList();
        }
    }
}
@using MVCOnlineShop.Models;

@*[anything you want here]*@

@{
    // stores the Session content in a var
    var Categories = Session["Categories"] as List<Category>;
}

@*Checks if the Session variable is correct*@
@if(Categories != null){
    <ul>
        @*For each category in the Session var, display the link*@
        @foreach(var Category in Categories){
            <li>
                @Html.ActionLink(Category.CategoryName, "Browse", new { Category = Category.CategoryName })
            </li>
        }
    </ul>
}
由于可以从应用程序中的任何位置访问会话变量,因此我们可以在您的\u layout.cshtml中访问它,以便显示列表中的每个
类别

会话变量可以存储任何
对象
,因此我们需要在操作它时显式地转换该值

List<Category> Categories = Session["Categories"] as List<Category>;

所以,你可以像下面这样做

创建一个CategoriesController并添加以下代码行,这些代码从数据库或其他地方获取您的类别

为category创建一个类,如下所示

public class CategoryViewModel
{
    public int CategoryId {get;set;}
    public string CategoryName {get;set;}
}
可以使用以下方法绑定虚拟数据

[HttpGet]
public ActionResult BlogCategories()
{
    List<CategoryViewModel> model= new List<CategoryViewModel>();
    model.Add(new CategoryViewModel(){CategoryId=1,CategoryName="AA"});
    model.Add(new CategoryViewModel(){CategoryId=2,CategoryName="BB"});
    model.Add(new CategoryViewModel(){CategoryId=3,CategoryName="CC"});
    model.Add(new CategoryViewModel(){CategoryId=4,CategoryName="DD"});
    return PartialView("BlogCategories",model);
}

希望这对您有所帮助。

您想在主页上显示类别列表,对吗?您的商店/索引不显示准确的链接吗?是的@MukeshKumarstore/index工作正常,但现在我想在主页上显示类别,而不是在商店中,而是在我的_layout.cshtml中,因为我使用的是bootstrap@rafalon,所以您可以在_layout.cshtml中调用
OnlineStoreEntities
的一个实例,然后在那里显示您想要的任何内容,但我不知道这是否是一个好的做法。_categoryRepository.GetCategoryList();这是my category repository类的实例,而不是这个,你可以通过任何其他方式获取数据。这是一个简单的例子。我真的认为OP希望链接显示在应用程序的任何地方,所以在_layout.cshtml中。您的示例将允许他仅在某个控制器的“BlogCategories”视图上显示链接。@Ahmad在
Application\u Start
方法下的
MVCAPApplication
类中插入
Session\u Start
方法。@Ahmad编辑了我的答案以匹配您的Global.asax。你介意删除你以前的评论吗,这样我们就不必把它移到聊天中去了?哦,谢谢你,谢谢你@Rafalon,它成功了:D,你花了这么多的努力来帮助我,真的很感谢,很感激,但只是想问你,到底发生了什么,所以它现在起作用了,请做一个小总结,因为我需要了解这件事以及发生了什么@Rafalon@Ahmad我认为您将方法放错了位置,或者将方法体放在
应用程序\u Start
中。
Application\u Start
方法是在会话状态可用之前调用的,因此这就是它不起作用的原因。
@model List<DotnetTutorial.Data.ViewModel.CategoryViewModel>

@foreach (var item in Model)
{
       <div class="categoryLi">
            @Html.RouteLink(item.CategoryName, "ArticlesCategoryList")
        </div>        
}
@Html.Action("BlogCategories", "Categories")