我试图在独立项目中创建一个可重复使用的小部件,我将来可以在其他解决方案中引用它。
我想实现以下目标:
解决方案结构如下:
Shared-UI (class-library)
/ Views
/ DataGrid
/ _DataGrid.cshtml
/ Models
/ DataGridModel.cs
/ Widgets
/ DataGrid.cs
ViewUtils.cs
Site (Actual MVC site)
/ Controllers
/ HomeController.cs
/ Views
/ Home
/ Index.cshtml
目前,站点项目中的Index
视图正在从Shared-UI项目中创建DataGrid
对象的新实例。在此对象上调用ToString()
将返回当前一些硬编码的HTML。
由于HTML变得非常复杂,我希望使用Razor
和DataGridModel
部分视图通过_DataGrid
生成HTML,而不是在类中进行硬编码。
我试图在我的ViewUtils
课程中使用以下方法来实现这一目标:
public static string RenderPartialToString(string controlName, object viewData)
{
ViewPage viewPage = new ViewPage() { ViewContext = new ViewContext() };
viewPage.ViewData = new ViewDataDictionary(viewData);
viewPage.Controls.Add(viewPage.LoadControl(controlName));
StringBuilder sb = new StringBuilder();
using (StringWriter sw = new StringWriter(sb))
{
using (HtmlTextWriter tw = new HtmlTextWriter(sw))
{
viewPage.RenderControl(tw);
}
}
return sb.ToString();
}
我是通过.ToString()
类的DataGrid
方法调用此方法:
public override string ToString()
{
DataGridModel model = new DataGridModel();
model.Id = this.Id;
string html = ViewUtils.RenderPartialToString("_DataGrid", model);
return html;
}
然而,当我尝试拨打HttpException
时会抛出viewPage.LoadControl(controlName)
,因为无法找到_DataGrid
视图(The file '/_DataGrid' does not exist.
)。我觉得它在我的站点项目中搜索视图,而不是在共享库中 - 但这只是一个猜测。 (我尝试了许多不同的视图路径组合,包括/排除完整路径和/或文件扩展名。)
有没有人知道如何让一个类库返回Razor使用其自己的库项目中包含的视图生成的HTML?