[英]ASP.NET CORE Render Razor View to string with controller parameters
我需要將部分視圖呈現為字符串。 為此,我使用以下 Helper 類:
public static string RenderRazorViewToString(Controller controller, string viewName, object model = null)
{
controller.ViewData.Model = model;
using (var sw = new StringWriter())
{
IViewEngine viewEngine =
controller.HttpContext.RequestServices.GetService(typeof(ICompositeViewEngine)) as
ICompositeViewEngine;
ViewEngineResult viewResult = viewEngine.FindView(controller.ControllerContext, viewName, false);
ViewContext viewContext = new ViewContext(
controller.ControllerContext,
viewResult.View,
controller.ViewData,
controller.TempData,
sw,
new HtmlHelperOptions()
);
viewResult.View.RenderAsync(viewContext);
return sw.GetStringBuilder().ToString();
}
}
這有效,但我現在需要一個類似的方法,它也接受參數列表。 我想呈現為字符串的視圖通過以下控制器方法調用:
public Task<IActionResult> IndexPartial(string? searchValue, string? filterValue)
{
IQueryable<Invoice> query
....Manipulate query by searchValue and filterValue
return PartialView("IndexPartial",await query.ToListAsync());
}
當我調用Helper.RenderRazorViewToString(controller, "IndexPartial", model)
我必須傳遞 stringValue 和 FilterValue。
有誰知道如何實現這一目標?
RenderRazorViewToString
的用法我想你應該明白了,這個方法是通過如下代碼調用的:
Helper.RenderRazorViewToString(controller, "PartialViewName", model);
第二個參數不是方法名,它是局部視圖名稱。它不會到達IndexPartial
方法。
您想要的是將帶有模型的部分視圖解析為filterValue
。模型數據通過通過searchValue
和filterValue
操作查詢獲得。
為了滿足您的要求,您需要做的應該是以下內容:
public string IndexPartial(string? searchValue, string? filterValue)
{
var model = _context.Pupils
.Where(a => a.Name.Contains(searchValue)&& a.Email.Contains(filterValue))
.FirstOrDefault(); //Manipulate query by searchValue and filterValue
//pass the correct model to the RenderRazorViewToString method
//then it would render the partial view to the correct string
var data = Helper.RenderRazorViewToString(this, "PartialViewName", model);
return data;
}
Maybe you can use an expression instead of a string parameter, like the following:
conditionLambda: p => true, orderLambda: p => p.Naam
public PagingViewModel<T> GetPaging(int page, int pagesize, Expression<Func<T, bool>> conditionLambda, Expression<Func<T, object>> orderLambda)
{
var items = _context.Set<T>()
.Where(conditionLambda)
.OrderBy(orderLambda)
.Skip(page * pagesize)
.Select(t => t)
.Take(pagesize)
.ToList();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.