2013-02-05 95 views
3

我有几个MVC4项目,我想制作一组在这些项目中重复使用的显示/编辑器模板。我想创建一个包含这些模板的通用项目,并在其他项目中引用它。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) 

Ide同盟,客户端项目可以用自己的模板覆盖,如果没有定义项目特定的模板,它将回退到通用模板。

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

回答

3

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

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

+2

干净的主意!我会研究这个。 –

+0

好东西,谢谢@Darin –

+0

NuGet包真棒,易于创建,部署,安装,卸载。另一个选择是将项目导出为VS模板'(文件 - >导出模板)'并在新的解决方案中重新使用它。 –