你真的不应该被直接调用ConfigurationManager你的看法。在MVC中,视图应该是'愚蠢的',即不具备数据结构或后端的任何知识,并且通过直接调用ConfigurationManager您的视图太了解您的设置存储方式。如果您将设置更改为使用其他商店(即数据库),那么您必须更改视图。
因此,您应该在别处获取该值并将其传递给您的视图,以便您的视图只需处理它就可以了。你可能有2种选择:
添加的东西到ViewBag并抓住它在视图
渲染从通过一个强类型的视图模型的局部视图公共控制器的操作。
我会阻止选项1,因为通常避免ViewBag是很好的,因为它没有强类型(Is using ViewBag in MVC bad?)。此外,要做到这一点,你必须从每个控制器的BaseController继承,这可能会很痛苦,或者创建一个覆盖ActionExecuted并填充ViewBag那里的东西的全局动作过滤器。
选项2可能更好。我想创建一个共同的控制器是这样的:
public class CommonController : Controller
{
[ChildActionOnly]
public ViewResult Settings()
{
// Get some config settings etc here and make a view model
var model = new SettingsModel { Foo = myProject.Properties.Settings.Default.foo };
return View(model);
}
}
然后在您的布局文件,你可以拨打:
@Html.Action("Settings", new { controller = "Common" })
这使得一个强类型的局部视图(〜/查看/通用/设置。 CSHTML),它看起来像:
@model YourProject.Models.SettingsModel
@if(Model.Foo)
{
// So something
}
这样,你仍然在使用强类型模型和视图,布局视图保持清洁,简单,你的部分观点仍然是“哑巴”