MVC4共享模板

时间:2013-02-05 21:30:07

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

我有几个MVC4项目,我想制作一组在这些项目中重复使用的显示/编辑器模板。我想创建一个包含这些模板的公共项目,并在其他项目中引用它。

所以我在我的公共项目中定义了视图,以及其他一些实用程序:

Common
- Models
  - CommonMetadataAttribute.cs
- Views
  - Shared
    - EditorTemplates
      - Decimal.cshtml
      - Object.cshtml
      - Password.cshtml
      - String.cshtml
      - Switch.cshtml
    - ViewTemplates
      - Object.cshtml
      - Switch.cshtml
    - Error.cstml

在我的客户项目的模型中,我有

using MobileWeb.Common

public class MyViewModel
{
    [UIHint("Switch")]
    [CommonMetadata(Theme = "foo")]
    public bool Enable { get; set; }
}

在客户端项目视图中,我只需调用:

即可生成自定义编辑器
@model MyViewModel
...
@Html.EditorFor(model => model.Enable)

理想情况下,客户端项目可以使用自己的模板覆盖,如果没有定义特定于项目的模板,它将回退到公共模板。

我已经考虑过MvcContrib的可移植区域,但是我不确定它是否会起作用,因为这不是一个真正的区域,我真的不知道如何设置它。在我走这条路之前,我想知道这样做的首选方式是什么?

1 个答案:

答案 0 :(得分:3)

就个人而言,我一直将模板打包为custom NuGets。您将自定义模板放在NuGet中,当用户在他的项目中安装此NuGet时,它们会自动添加到其应用程序的正确文件夹中。并且自动化整个应用程序中的所有EditorFor / DisplayFor调用都开始使用您的自定义模板而不是默认模板。

这样您就不需要编写一些自定义VirtualPathProviders(一旦预编译应用程序就会中断),以便检索嵌入第三方程序集中的Razor视图等等......使用NuGets的另一个优点是用户在他的应用程序中有你的模板,如果他对你的工作不满意,可以很容易地修改它们。如果他真的生你的气,他所需要的就是卸载你的NuGet,以便将他的应用程序回滚到默认状态。