在asp.net MVC 4中拥有站点范围通用属性的正确方法
本文关键字:属性 方法 范围 站点 net asp MVC 拥有 | 更新日期: 2023-09-27 18:15:27
简短的问题:什么是正确的方式,使共同的,全站范围的属性:
- 在
_layout.cshtml
和其他视图中均可访问 - 强类型,即。模型。TextInUserLanguage
同时还允许自定义控制器到他们自己的模型?
换句话说,如何告诉asp.net
- 默认使用
CommonModel
和_layout.cshtml
- 当访问具有自己的模型M/view V的控制器C时,将模型M应用于视图V(同时仍然尊重规则#1)
很长的故事
我创建了一个示例asp.net MVC 4 web应用程序,它默认具有HomeController
和AccountController
HomeController.cs
public ActionResult Index()
{
CommonModel Model = new CommonModel { PageTitle = "HomePage" };
return View(Model);
}
BaseModel.cs
public abstract class BaseModel
{
public string AppName { get; set; }
public string Author { get; set; }
public string PageTitle { get; set; }
public string MetaDescription { get; set; }
...
}
CommonModel.cs
public class CommonModel: BaseModel
{
public CommonModel()
{
AppName = Properties.Settings.Default.AppName;
Author = Properties.Settings.Default.Author;
MetaDescription = Properties.Settings.Default.MetaDescription;
}
}
_layout.cshtml
@model K6.Models.BaseModel
<!DOCTYPE html>
<html>
<head>
<title>@Model.PageTitle - @Model.AppName</title>
...
问题是,这种方法:
- 我必须改变我的web应用程序中的每个控制器,以便他们使用这个
CommonModel
,以使_layout.cshtml
识别我的自定义属性,但同时这需要显著的工作,以使事情在处理HTTP帖子时工作,显示列表等…
一定有别的办法。我是新的asp.net MVC,所以什么是最好的方法来做到这一点关于必须使用ViewBag
?
我首先想到的是静态的
public static class ServerWideData {
private static Dictionary<string, Data> DataDictionary { get; set; } = new Dictionary<string, Data>();
public static Data Get(string controllerName = "") { // Could optionally add a default with the area and controller name
return DataDictionary[controllerName];
}
public static void Set(Data data, string name = "") {
DataDictionary.Add(name, data);
}
public class Data {
public string PropertyOne { get; set; } = "Value of PropertyOne!!";
// Add anything here
}
}
你可以通过调用
从任何地方添加数据 ServerWideData.Set(new Data() { PropertyOne = "Cheese" }, "Key for the data")
并在任何地方检索
ServerWideData.Get("Key for the data").PropertyOne // => Cheese