ASP.NET MVC 中,视图是放置在 Web 应用程序的目录结构中的。然而,有时候需要从外部 DLL 加载视图。下面提供一种实现方法:
创建一个类库项目来保存视图。在该项目中创建一些视图,文件夹路径与 Web 应用程序中视图的路径相同。
在该类库项目中添加一个非托管资源文件(.resx),并将资源设置为“嵌入型”:
创建一个扩展方法,该方法可以在运行时加载视图:
public static MvcHtmlString LoadExternalView(this HtmlHelper htmlHelper, string viewName, string assemblyName)
{
string typeName = $"{assemblyName}.Views.{viewName}";
Assembly assembly = Assembly.Load(assemblyName);
Type type = assembly.GetType(typeName);
if (type != null)
{
object instance = Activator.CreateInstance(type);
var razorViewEngine = new RazorViewEngine();
var fakeControllerContext = new ControllerContext();
fakeControllerContext.HttpContext = new HttpContextWrapper(HttpContext.Current);
fakeControllerContext.RouteData = new RouteData();
var result = razorViewEngine.FindView(fakeControllerContext, viewName, "", false);
var view = result.View;
var viewContext = new ViewContext(fakeControllerContext, view, result.ViewData, result.TempData,
new StringWriter());
viewContext.ViewBag.Title = viewName;
var executedView = ((IView)instance);
executedView.Render(viewContext, viewContext.Writer);
return MvcHtmlString.Create(viewContext.Writer.ToString());
}
return null;
}
@Html.LoadExternalView("ExternalView.cshtml", "MyExternalLibrary")
注意