利用asp.net MVC的扩展性,我们可以重新定义视图引擎,将视图文件*.cshtml也一并打包到程序集中。
这样可以提高基于MVC框架的程序集的独立性,简化部署难度。
首选重新定义一个视图引擎:
源码如下:
namespace Helpers
{
/// <summary>
/// 对标准的RazorViewEngine扩展,以使得视图引擎能找到程序集中打包的资源作为视图
/// </summary>
public class ResViewEngine : RazorViewEngine
{
/// <summary>
/// 资源可能在的命名空间集合
/// </summary>
[Inject]
public string[] ResNamespaces { get; set; }
private static string rootPath = System.Web.Hosting.HostingEnvironment.MapPath("~");
private string[] _startWiths = { "~/Views/", "~/Areas/" };
private string logFile = Path.Combine(rootPath, "App_Data", "ResViews.txt");
public ResViewEngine()
{
//删除以前写过的文件
if (File.Exists(logFile))
{
string[] fileNameStrs = File.ReadAllText(logFile).Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
foreach (string fn in fileNameStrs)
{
if (File.Exists(fn))
File.Delete(fn);
}
File.Delete(logFile);
}
}
protected override bool FileExists(ControllerContext controllerContext, string virtualPath)
{
if (base.FileExists(controllerContext, virtualPath))
{
return true;
}
if (ResNamespaces == null) return false;
foreach (string startWith in _startWiths)
{
if (!virtualPath.StartsWith(startWith)) continue;
string tail = virtualPath.Substring(startWith.Length);
tail = tail.Replace("/", ".");
Stream stream = null;
foreach (string ns in ResNamespaces)
{
string nst = ns.Replace(".Controllers", "");
string resName = nst + startWith.Replace("/", ".").Replace("~", "") + tail;
stream = Assembly.Load(nst).GetManifestResourceStream(resName);
if (stream != null) break;
}
if (stream == null) return false;
string path = controllerContext.HttpContext.Server.MapPath(virtualPath);
IOHelper.WriteStreamToFile(stream, path);
//将写过的文件路径名记入一个文本文件
File.AppendAllText(logFile, path + Environment.NewLine);
}
return base.FileExists(controllerContext, virtualPath);
}
}
}
当然,有一些帮助类需要自行补充。
还需要在global.asax.cs中将上述的视图引擎取代原有的:
protected virtual void Application_Start()
{
AreaRegistration.RegisterAllAreas();
//......
ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new ResViewEngine());
}
最后,将需要打包的视图在VS2013中,按F4进入属性窗口,生成操作,选择”嵌入的资源“