MVC Widget在类库中生成

时间:2016-08-19 09:52:35

标签: asp.net-mvc razor widget partial-views

我试图在独立项目中创建一个可重复使用的小部件,我将来可以在其他解决方案中引用它。

我想实现以下目标:

  • 在我的MVC项目中,我可以调用我的类库(单独的项目)中包含的帮助器方法,它将生成我需要的HTML。 (这已经实施)。
  • 返回的HTML目前在类中是硬编码的(坏)。 HTML不应该在类中进行硬编码,而应该使用剃刀视图引擎来生成HTML。它应该使用类库本身中包含的.cshtml文件来完成此操作。

解决方案结构如下:

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变得非常复杂,我希望使用RazorDataGridModel部分视图通过_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?

0 个答案:

没有答案