【问题标题】:how to generate one html page from partial views如何从部分视图生成一个 html 页面
【发布时间】:2016-02-20 12:27:00
【问题描述】:

假设我有以下课程:

class Restaraunt
{
 int RestarauntType {get; set;}
 string Address {get; set;}
 string phone {get; set;}
 .....30 more properties
}   

所以,我有一个 Restaraunts 列表,并且我有空白的 html 表单,其中包含 html 元素。

<span class="address"></span>   
<span class="email"></span>   

现在,我有大约 5 种不同的 html 布局,它们的大小都相同。
根据 Restaraunt 类型,我想选择一个模板并用信息填充它,然后获取下一个 restaraunt 并附加它。所以我有很长的 html 页面准备好打印。这是我正在考虑的一些伪代码。此外,欢迎就如何做到这一点提出建议。

if (restarauntType==1)
{
  var completedForm = GetAndPopulateCsHtmlForm1("/forms/myformNum1.cshtml")
 AppendForm(completedForm)
}
else if (restarauntType==2)
{
....
}

【问题讨论】:

  • 我认为我正在做与您需要的完全相同的事情 - 我有一个不同任务的列表,每个任务最终都有一个部分视图。在我的最终报告中,我将所有视图合并到一个大 HTML 页面中。这是你想要达到的目标吗?
  • 你的问题是什么
  • 我不确定我是否正确理解了您的问题。我发布了一个答案,希望这是你想要的。
  • @wapac,是的。就是这样

标签: c# html asp.net asp.net-mvc razor


【解决方案1】:

在你的主 html 中,试试这个:

@model System.Collections.Generic.List<Restaurant>

@{
    foreach (var restaurant in Model) {
        Html.RenderAction("Child", "Restaurants", restaurant);
    }
}

在你的RestaurantsController

[ChildActionOnly]//optional depending on whether you want to allow rendering this action directly
public ActionResult Child(Restaurant restaurant)
{
    string viewName = //GetYourView depending on your restaurant type
    return PartialView(viewName, restaurant);
}

根据您确定分部的方式,有很多方法可以获取您的视图。您可以将您的部分存储在按类型索引的字典中并像这样访问它以避免切换大小写:

string viewName = restaurantPartial[restaurant.RestarauntType];

那么你可以有不同的布局,例如:

Restaurant1.cshtml

@model Restaurant

<span class="address">@Model.Address</span>   
<span class="email">@Model.Email</span>  

餐厅2.cshtml:

@model Restaurant

<li class="address">@Model.Address</li>   
<li class="email">@Model.Email</li>  

【讨论】:

    【解决方案2】:

    我正在做类似的事情。我的 HTML 报告代码的核心是这个方法,它允许我将视图呈现为字符串:

    public static string RenderRazorViewToString(string viewName, object model)
    {
      HttpContext context = GetContext();
      HttpContextWrapper httpContext = new HttpContextWrapper(context);
      RouteData routeData = new RouteData();
      routeData.Values.Add("controller", "HtmlFake");
      RequestContext requestContext = new RequestContext(httpContext, routeData);
      ControllerContext controllerContext = new ControllerContext(requestContext, new HtmlFakeController());
    
      using (var sw = new StringWriter())
      {
        ViewDataDictionary viewData = new ViewDataDictionary(model);
        ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(controllerContext, viewName);
        TempDataDictionary tempData = new TempDataDictionary();
        ViewContext viewContext = new ViewContext(controllerContext, viewResult.View, viewData, tempData, sw);
        viewResult.View.Render(viewContext, sw);
        viewResult.ViewEngine.ReleaseView(controllerContext, viewResult.View);
        return sw.GetStringBuilder().ToString();
      }
    }
    
    public class HtmlFakeController : Controller
    {
    }
    

    然后我可以完成的每项任务:

                  object model = GetTaskModel(task.Id);
                  string viewData = RenderRazorViewToString(string.Format("~/Views/Task/{0}.cshtml", taskName), model);
    

    最后,我只是简单地使用 StringBuilder 来加入视图:

                sb.Append(viewData);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-24
      • 1970-01-01
      • 1970-01-01
      • 2020-01-26
      • 1970-01-01
      • 2013-04-25
      • 1970-01-01
      • 2020-02-22
      相关资源
      最近更新 更多