![](/img/trans.png)
[英]Using ViewRenderer for rendering a PartialView in SignalR response?
[英]Render MVC PartialView into SignalR response
我想將PartialView呈現為HTML字符串,以便將其返回到SignalR ajax請求。
就像是:
SignalR Hub (mySignalHub.cs)
public class mySignalRHub: Hub
{
public string getTableHTML()
{
return PartialView("_MyTablePartialView", GetDataItems()) // *How is it possible to do this*
}
}
Razor 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>
我的問題是我似乎無法在Controller之外渲染PartialView。 甚至可以在Controller外部渲染PartialView嗎? 能夠利用Razor附帶的令人敬畏的HTML生成能力將是非常好的。
我錯了嗎? 還有另外一種方法嗎?
這里,這是我在控制器中使用的ajax,我修改了一下所以它可以從方法而不是控制器調用,方法returnView
渲染你的視圖並返回HTML字符串,這樣你就可以將JS / jQuery插入你的頁面了你在客戶端收到它:
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));
}
我沒有在Hub上測試它,但它應該工作。
可能最好的選擇是使用RazorEngine ,正如Wim所暗示的那樣。
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)之外托管Razor。
基於下面提供的相似問題的答案,我建議使用
Html.Partial( partialViewName )
它返回一個MvcHtmlString,您應該將其用作SignalR響應的內容。 但是,我沒有測試過這個。
堆棧溢出問題: 是否可以在控制器外渲染視圖?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.