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

时间:2016-10-29 18:47:44

标签: c# asp.net asp.net-mvc asp.net-mvc-4 razor

简短问题:具有以下常见网站范围属性的正确方法是什么:

  1. _layout.cshtml和其他观点
  2. 均可访问
  3. 强类型,即。 Model.TextInUserLanguage
  4. 同时仍允许自定义控制器使用自己的模型吗?

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

    1. 默认情况下CommonModel使用_layout.cshtml
    2. 当访问具有自己的模型 M / view V 的控制器 C 时,应用模型M来查看V(同时仍然遵守规则#1)
    3. 长篇故事

      我创建了一个示例asp.net MVC 4 webapp,默认情况下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. 真的感觉很讨厌
      2. 我必须更改我的webapp中的每个控制器,以便他们使用此CommonModel以使_layout.cshtml识别我的自定义属性,但同时这需要大量工作才能制作东西在处理HTTP帖子,显示列表等时工作......
      3. 必须有其他方法来做到这一点。我是asp.net MVC的新手,那么关于必须使用ViewBag的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

我想到的第一个是静态的

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