我想呈现PartialView到HTML字符串,以便我可以将它返回到SignalR Ajax请求。
就像是:
SignalR集线器 (mySignalHub.cs)
public class mySignalRHub: Hub
{
public string getTableHTML()
{
return PartialView("_MyTablePartialView", GetDataItems()) // *How is it possible to do this*
}
}
剃刀PartialView(_MyTablePartialView.cshtml)
@model IEnumerable<DataItem>
<table>
<tbody>
@foreach (var dataItem in Model)
{
<tr>
<td>@dataItem.Value1</td>
<td>@dataItem.Value2</td>
</tr>
}
</tbody>
</table>
HTML(MySignalRWebPage.html)
<Script>
...
//Get HTML from SignalR function call
var tableHtml = $.connection.mySignalRHub.getTableHTML();
//Inject into div
$('#tableContainer).html(tableHtml);
</Script>
<div id="tableContainer"></div>
我的问题是,我似乎无法呈现控制器之外的PartialView。 它甚至有可能呈现一个控制器之外的PartialView? 这将是非常好的,仍然能够充分利用真棒HTML生成能力来与剃刀。
我要对所有这一切错了吗? 有另一种方式?
在这里,这是我在控制器的AJAX使用,我修改了一点,所以它可以从方法,而不是控制器被调用,方法returnView
渲染视图并返回HTML字符串,所以你可以用JS / jQuery的将其插入到你的页面时,你recive它在客户端:
public static string RenderPartialToString(string view, object model, ControllerContext Context)
{
if (string.IsNullOrEmpty(view))
{
view = Context.RouteData.GetRequiredString("action");
}
ViewDataDictionary ViewData = new ViewDataDictionary();
TempDataDictionary TempData = new TempDataDictionary();
ViewData.Model = model;
using (StringWriter sw = new StringWriter())
{
ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(Context, view);
ViewContext viewContext = new ViewContext(Context, viewResult.View, ViewData, TempData, sw);
viewResult.View.Render(viewContext, sw);
return sw.GetStringBuilder().ToString();
}
}
//"Error" should be name of the partial view, I was just testing with partial error view
//You can put whichever controller you want instead of HomeController it will be the same
//You can pass model instead of null
private string returnView()
{
var controller = new HomeController();
controller.ControllerContext = new ControllerContext(HttpContext,new System.Web.Routing.RouteData(), controller);
return RenderPartialToString("Error", null, new ControllerContext(controller.Request.RequestContext, controller));
}
我没有测试它在集线器,但它应该工作。
也许是最好的选择是使用RazorEngine ,如维姆是在暗示。
public class mySignalRHub: Hub
{
public string getTableHTML()
{
var viewModel = new[] { new DataItem { Value1 = "v1", Value2 = "v2" } };
var template = File.ReadAllText(Path.Combine(
AppDomain.CurrentDomain.BaseDirectory,
@"Views\PathToTablePartialView\_MyTablePartialView.cshtml"));
return Engine.Razor.RunCompile(template, "templateKey", null, viewModel);
}
}
为了进一步推动@ user1010609上面提供的答案,我通过这个挣扎以及和已经结束了,返回给控制器的名字所呈现的PartialView,路径视图和模型的功能。
考虑到这样的事实,你没有一个控制器,因此没有通常状态的为来自SignalR事件到来。
public static string RenderPartialView(string controllerName, string partialView, object model)
{
var context = new HttpContextWrapper(System.Web.HttpContext.Current) as HttpContextBase;
var routes = new System.Web.Routing.RouteData();
routes.Values.Add("controller", controllerName);
var requestContext = new RequestContext(context, routes);
string requiredString = requestContext.RouteData.GetRequiredString("controller");
var controllerFactory = ControllerBuilder.Current.GetControllerFactory();
var controller = controllerFactory.CreateController(requestContext, requiredString) as ControllerBase;
controller.ControllerContext = new ControllerContext(context, routes, controller);
var ViewData = new ViewDataDictionary();
var TempData = new TempDataDictionary();
ViewData.Model = model;
using (var sw = new StringWriter())
{
var viewResult = ViewEngines.Engines.FindPartialView(controller.ControllerContext, partialView);
var viewContext = new ViewContext(controller.ControllerContext, viewResult.View, ViewData, TempData, sw);
viewResult.View.Render(viewContext, sw);
return sw.GetStringBuilder().ToString();
}
}
你会用类似的东西把它叫做:
RenderPartialView("MyController", "~/Views/MyController/_partialView.cshtml", model);
你有没有想过用剃刀将模板引擎就像http://razorengine.codeplex.com/ ? 你不能用它来解析的部分观点,但你可以用它来解析剃刀模板,这几乎是相似的局部视图。
如何使用RazorEngineHost
和RazorTemplateEngine
。 我发现这个好文章 ,可能是你在找什么。 这是关于ASP.NET(MVC)的外承载剃刀。
根据提供给下面asimilar问题的答案,我会建议使用
Html.Partial(partialViewName)
它返回一个MvcHtmlString,你应该能够为您的SignalR效应初探的内容使用。 我还没有测试但此。
堆栈溢出问题: 是否有可能使控制器外的看法?