C# ASP.NET MVC 2中部分视图的问题
这是母版页:C# ASP.NET MVC 2中部分视图的问题,c#,.net,asp.net-mvc,views,partial-views,C#,.net,Asp.net Mvc,Views,Partial Views,这是母版页: <%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml">
<%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title><asp:ContentPlaceHolder ID="TitleContent" runat="server" /></title>
<link href="../../Content/Site.css" rel="stylesheet" type="text/css" />
<asp:ContentPlaceHolder ID="header1" runat="server" />
</head>
<body>
<div class="page">
<div id="header">
<div id="title">
<h1>My MVC Application</h1>
</div>
<div id="logindisplay">
<% Html.RenderPartial("LogOnUserControl"); %>
</div>
<div id="menucontainer">
<ul id="menu">
<li><%= Html.ActionLink("Home", "Index", "Home")%></li>
<li><%= Html.ActionLink("About", "About", "Home")%></li>
<li><%= Html.ActionLink("Imoveis", "Index", "Categoria")%></li>
<li><%= Html.ActionLink("Admin", "Index", "Admin")%></li>
<li><%= Html.ActionLink("User", "Index", "User")%></li>
</ul>
</div>
</div>
<div id="left">
<% Html.RenderPartial("~/Views/Imovel/Pesquisa.ascx"); %>
</div>
<div id="main">
<asp:ContentPlaceHolder ID="MainContent" runat="server" />
<div id="footer">
</div>
</div>
</div>
</body>
</html>
由于部分视图位于母版页中,如何获取其模型?如果需要在每个请求中查询,您可以为控制器创建基类并在创建过程中进行设置:
public class BaseController : Controller
{
public BaseController()
{
var catRepository = ...;
ViewData["Categoriass"] = new SelectList(catRepository.FindAllCategorias().AsEnumerable(), "id", "nome", 3);
}
}
这并不是真正有效的,因为它将与每个控制器一起执行。您还可以创建设置ViewData的操作筛选器,并在需要时应用它。您可以为控制器创建基类,并在创建过程中设置它,如果您需要在每个请求中查询它:
public class BaseController : Controller
{
public BaseController()
{
var catRepository = ...;
ViewData["Categoriass"] = new SelectList(catRepository.FindAllCategorias().AsEnumerable(), "id", "nome", 3);
}
}
这并不是真正有效的,因为它将与每个控制器一起执行。您还可以创建操作过滤器,设置ViewData并在需要时应用它。我认为您应该创建一个操作过滤器并将其应用到控制器上 创建一个像这样的操作过滤器
public class DataForMasterPageAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
//initiate your repository
var catRepository = ...;
//then create the viewdata like so
filterContext.Controller.ViewData["Categorias"] = new SelectList(catRepository.FindAllCategorias().AsEnumerable(), "id", "nome", 3);
}
}
然后在控制器上应用它,它也将适用于所有操作。就这样,
[DataForMasterPage]
public class CategoriaController : Controller
{
public ActionResult Index()
{
ViewData["Message"] = "Welcome to ASP.NET MVC!";
return View();
}
}
在局部视图上,您只需像往常一样调用ViewData,无需更改任何内容
<div class="editor-label">
<%= Html.LabelFor(model => model.categoria_id) %>
</div>
<div class="editor-field">
<%= Html.DropDownListFor(model => model.categoria_id, (SelectList)ViewData["Categorias"], "--Selecciona um--")%>
<%= Html.ValidationMessageFor(model => model.categoria_id) %>
</div>
型号.类别(id)%>
model.categoria_id,(SelectList)视图数据[“Categorias”],“--Selecciona um-->”
型号.类别(id)%>
可能会有性能问题,但这是避免在每个方法上设置ViewData的最简单方法之一。我认为您应该创建一个ActionFilter并将其应用于控制器 创建一个像这样的操作过滤器
public class DataForMasterPageAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
//initiate your repository
var catRepository = ...;
//then create the viewdata like so
filterContext.Controller.ViewData["Categorias"] = new SelectList(catRepository.FindAllCategorias().AsEnumerable(), "id", "nome", 3);
}
}
然后在控制器上应用它,它也将适用于所有操作。就这样,
[DataForMasterPage]
public class CategoriaController : Controller
{
public ActionResult Index()
{
ViewData["Message"] = "Welcome to ASP.NET MVC!";
return View();
}
}
在局部视图上,您只需像往常一样调用ViewData,无需更改任何内容
<div class="editor-label">
<%= Html.LabelFor(model => model.categoria_id) %>
</div>
<div class="editor-field">
<%= Html.DropDownListFor(model => model.categoria_id, (SelectList)ViewData["Categorias"], "--Selecciona um--")%>
<%= Html.ValidationMessageFor(model => model.categoria_id) %>
</div>
型号.类别(id)%>
model.categoria_id,(SelectList)视图数据[“Categorias”],“--Selecciona um-->”
型号.类别(id)%>
可能会有性能问题,但这是避免在每个方法上设置ViewData的最简单方法之一。我尝试过Nick Masao和LukLed的解决方案,它们都是有效的 但是,viewdata是为母版页设置的,在我的例子中,我假设母版页将呈现每个页面 我必须 应用[DataForMasterPage]属性(Nick Masao的解决方案)或 或 继承BaseController(LukLed的解决方案) 在每个视图的控制器上
那么,是否可以创建一个类并在Global.asax应用程序启动事件上调用以使其每次都设置viewdata?我尝试了Nick Masao和LukLed的解决方案,这两种解决方案都很有效 但是,viewdata是为母版页设置的,在我的例子中,我假设母版页将呈现每个页面 我必须 应用[DataForMasterPage]属性(Nick Masao的解决方案)或 或 继承BaseController(LukLed的解决方案) 在每个视图的控制器上
那么,是否可以创建一个类并在Global.asax Application\u Start事件上调用以使其每次都设置viewdata?您还可以创建一个ContentPlaceHolder,在其中希望局部视图呈现,并从基础页面调用RenderPartial()。通过这种方式,您可以像往常一样传递模型。您还可以创建一个ContentPlaceHolder,希望局部视图在其中呈现,并从基础页面调用RenderPartial()。这样你就可以像往常一样通过模型了