在asp.net MVC 4中拥有站点范围通用属性的正确方法

本文关键字:属性 方法 范围 站点 net asp MVC 拥有 | 更新日期: 2023-09-27 18:15:27

简短的问题:什么是正确的方式,使共同的,全站范围的属性:

  1. _layout.cshtml和其他视图中均可访问
  2. 强类型,即。模型。TextInUserLanguage

同时还允许自定义控制器到他们自己的模型?

换句话说,如何告诉asp.net

  1. 默认使用CommonModel_layout.cshtml
  2. 当访问具有自己的模型M/view V的控制器C时,将模型M应用于视图V(同时仍然尊重规则#1)

很长的故事

我创建了一个示例asp.net MVC 4 web应用程序,它默认具有HomeControllerAccountController

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>
    ...

问题是,这种方法:

  1. 我必须改变我的web应用程序中的每个控制器,以便他们使用这个CommonModel,以使_layout.cshtml识别我的自定义属性,但同时这需要显著的工作,以使事情在处理HTTP帖子时工作,显示列表等…

一定有别的办法。我是新的asp.net MVC,所以什么是最好的方法来做到这一点关于必须使用ViewBag ?

在asp.net MVC 4中拥有站点范围通用属性的正确方法

我首先想到的是静态的

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