C# 获取特定的控制器视图数据
我是ASP.net的新手,做了10年的PHP程序员。MVC是有意义的,因为我发现它非常类似于 在ASP.NETMVC4项目中,我正在努力寻找存储元数据并为我的网页提供元数据的最佳解决方案。根据我所读到的,我得出结论使用以下方法 型号C# 获取特定的控制器视图数据,c#,asp.net,asp.net-mvc,asp.net-mvc-4,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 4,我是ASP.net的新手,做了10年的PHP程序员。MVC是有意义的,因为我发现它非常类似于 在ASP.NETMVC4项目中,我正在努力寻找存储元数据并为我的网页提供元数据的最佳解决方案。根据我所读到的,我得出结论使用以下方法 型号 using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace project.Models { public class Met
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace project.Models
{
public class Meta
{
public String Title { get; set; }
public String Description { get; set; }
public String Keywords { get; set; }
public String H1 { get; set; }
public String H2 { get; set; }
public String Robots { get; set; }
}
}
控制器
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace project.Controllers
{
public class AboutController : BaseController
{
public ActionResult Index()
{
ViewData["metaTitle"] = "About us";
ViewData["metaDescription"] = "";
ViewData["metaKeywords"] = "";
ViewData["pageH1"] = "About";
ViewData["PageH2"] = "";
return View();
}
}
}
查看
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>project | @ViewData["metaTitle"]</title>
<meta name="description" content="@ViewData["metaDescription"]">
<meta name="keywords" content="@ViewData["metaKeywords"]">
<meta name="robots" content="@ViewData["metaRobots"]">
项目|@ViewData[“元标题”]
我的问题实际上来自于我的另一个观点,我试图建立一个面包屑路径。目前,我可以将控制器/操作名称显示在面包屑中,但是我希望访问这些控制器/操作的视图数据
如果可能的话,我找不到任何地方能解释怎么做
因此,
- 要么我将元数据存储错误,如果是这样,请告诉我更好的方法
- 否则,请概述访问控制器视图数据的方法
非常感谢您抽出时间。我会做如下事情 1) 创建一个基类模型,该基类模型将在其他模型中派生
public class BaseModel
{
public String Title { get; set; }
public String Description { get; set; }
public String Keywords { get; set; }
public String H1 { get; set; }
public String H2 { get; set; }
public String Robots { get; set; }
}
关于模型课
@model <YourNameSpace>.BaseModel
<title>@Model.Title</title>
2) 在BaseController类中创建一个Initialize方法,该方法将为模型的标题和描述设置属性
public class BaseController : Controller
{
public BaseModel Initialize(BaseModel model)
{
model.Title = "Title";
model.Description = "Desc";
return model;
}
}
3) 在About controller中,您需要调用如下所示的initialize方法
public class AboutController : BaseController
{
public ActionResult Index()
{
//create instance for About Model
var model = new AboutModel();
Initialize(model);
model.AboutDescription = "About Description";
return View(model);
}
}
4) 在_Layout.cshtml类中,您需要使用BaseModel类
@model <YourNameSpace>.BaseModel
<title>@Model.Title</title>
@model.BaseModel
@模型名称
5) 其他视图例如:About.cshtml
@model <YourNameSpace>.AboutModel
@model.AboutModel
我建议不要使用ViewData来处理常见的站点属性,如标题/元标记。这样你的代码会更干净
由于您正在将基类模型派生到其他视图,并在所有ActionResults方法中初始化Initialize方法,因此您应该跨页面/视图获取标题描述属性。ViewData将仅存储单个请求的数据(在您访问about节时)。但据我所知,您需要整个应用程序(页面)的数据。我建议使用Session而不是ViewData。我永远都不明白这是如何得到2张赞成票的。请不要把这个课程用于这样的事情。讽刺的是,这几乎是唯一真正可以接受的使用
ViewData
/ViewBag
的方法。但是,Anupam是正确的,除了当前请求的控制器操作之外,您无法获取任何其他操作的视图数据。如果您需要获取多个不同控制器操作的数据,最好的办法是将Meta
类与它应用的操作的某些链接持久化,以便您可以在以后查找它。然后,在每个操作中,您可以查询应用于它的Meta
实例,以及您需要的任何其他Meta
实例。让布局声明模型实际上是一个非常糟糕的主意。将这些类型的东西存储在ViewData
/ViewBag
中是完全可以接受的,而且实际上更可取,因为如果您忽略声明它们,它们不会杀死您的应用程序,或者您需要从基本模型以外的东西继承视图模型,或者您有一个完全不需要模型的视图。@Chris我在某个地方读到,使用ViewData/ViewBag不是一个好的实践问题是,它被滥用和使用的次数超过了它应该被滥用的次数,并且在不应该被滥用的情况下。对于页面的title标签或description meta标签的填充来说,这是非常好的。不好的做法是,当您开始尝试在其中存储除简单值类型以外的内容时,比如选择列表,甚至整个模型。