【发布时间】:2014-06-14 11:01:58
【问题描述】:
Views 文件夹中的资源是 CSS,View 中使用的图像,现在我知道它与它的含义不同,我们已经将所有内容都放在了 Contents 文件夹中,但我正在寻找更好的方法来管理它。
我们有一个非常大的 MVC 4,有很多区域,每个区域都有很多视图。为了维护所有内容,我们在内容文件夹中创建了类似的文件夹结构,以相应地分发 CSS 和图像。
但问题是,引用视图中的每个资源。跟踪变得困难,这里是文件夹结构。
- 区域
- 应用程序
- 控制器
- 查看次数
- 项目
- Search.cshtml
- 用户
- Account.cshtml
- 项目
- 应用程序
- 内容
- common.less
- 应用程序
- app.less
- 一些按钮.png
- projects.less
- users.less
现在当我们有太多资源并且很难交叉引用时会出现问题,因为我们会更改用户界面,随着项目的增长会出现新的视图。
我想要以下格式的资源,
- 区域
- 应用程序
- 控制器
- 查看次数
- 项目
- Search.cshtml
- search.less
- 一些按钮.png
- 用户
- Account.cshtml
- account.less
- 一些按钮.png
- 项目
- 应用程序
我怎样才能轻松做到?
我的每个控制器都派生自一个通用 AppController,我们在其中验证用户身份验证和角色。我已经实现了 CustomActionInvoker 来查找如下视图。
private string defaultViewName = "";
protected virtual object GetDefaultViewModel() {
return null;
}
public virtual ActionResult DefaultView() {
try
{
var view = this.View(defaultViewName);
if (view == null)
{
return HttpNotFound(defaultViewName + " View not found");
}
ViewBag.Title = defaultViewName;
}
catch
{
//Utils.Log(ex);
//throw;
return HttpNotFound(defaultViewName + " View not found");
}
return View(defaultViewName, GetDefaultViewModel());
}
protected override IActionInvoker CreateActionInvoker()
{
return new DefaultViewInvoker(base.CreateActionInvoker(), this);
}
internal class DefaultViewInvoker : ControllerActionInvoker {
private IActionInvoker parent;
private CastingWebController wc;
internal DefaultViewInvoker(IActionInvoker parent, CastingWebController wc)
{
this.parent = parent;
this.wc = wc;
}
protected override ActionDescriptor FindAction(ControllerContext controllerContext, ControllerDescriptor controllerDescriptor, string actionName)
{
ActionDescriptor ad = base.FindAction(controllerContext, controllerDescriptor, actionName);
if (ad == null) {
wc.defaultViewName = actionName;
ad = base.FindAction(controllerContext, controllerDescriptor, "DefaultView");
}
return ad;
}
}
这很好用,即使我们在控制器上没有操作方法,它也会分发 CSHTML 文件。但是,这不适用于 CSS 和图像。
例子,
/App/Projects/Search
易于处理和提供服务,我们无论如何都看不到原始 CSHTML 下载。
App/Views/Projects/Search.cshtml
我在访问方面几乎不需要帮助
/App/Projects/Search.css
/App/Projects/some-button.png
在路径
/App/Views/Projects/Search.css
/App/Views/Projects/some-button.png
由于这些不是 CSHTML,因此取景器找不到它们,而且我需要将它们作为静态下载提供,除了 cshtml、aspx 和注册的 mime 类型之外的任何东西。
此外,我们还为移动设备和平板电脑提供了 DisplayModes,这使得管理资源变得更加困难。
【问题讨论】:
-
为什么这些资源在 Views 文件夹中? Views 文件夹用于...视图。
-
@AntP 我当然知道,资源是 CSS,视图内部使用的图像。
-
将它们放在“css”和“images”文件夹中的views文件夹之外。
-
@AntP 请阅读这个问题,我们已经将它们放在目录之外的视图中。
标签: c# asp.net-mvc asp.net-mvc-routing