我有几个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的可移植区域,但是我不确定它是否会起作用,因为这不是一个真正的区域,我真的不知道如何设置它。在我走这条路之前,我想知道这样做的首选方式是什么?
答案 0 :(得分:3)
就个人而言,我一直将模板打包为custom NuGets
。您将自定义模板放在NuGet中,当用户在他的项目中安装此NuGet时,它们会自动添加到其应用程序的正确文件夹中。并且自动化整个应用程序中的所有EditorFor / DisplayFor调用都开始使用您的自定义模板而不是默认模板。
这样您就不需要编写一些自定义VirtualPathProviders(一旦预编译应用程序就会中断),以便检索嵌入第三方程序集中的Razor视图等等......使用NuGets的另一个优点是用户在他的应用程序中有你的模板,如果他对你的工作不满意,可以很容易地修改它们。如果他真的生你的气,他所需要的就是卸载你的NuGet,以便将他的应用程序回滚到默认状态。