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")