如何解决ASP.NET CORE将Razor视图渲染为带有控制器参数的字符串
我需要将部分视图呈现为字符串。 为此,我使用以下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();
}
}
这可行,但是我现在需要一个类似的方法,该方法也接受参数列表。 我要呈现为字符串的View通过以下Controller方法调用:
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
方法。
您想要的是将带有模型的局部视图解析为字符串。通过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,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,object>> orderLambda)
{
var items = _context.Set<T>()
.Where(conditionLambda)
.OrderBy(orderLambda)
.Skip(page * pagesize)
.Select(t => t)
.Take(pagesize)
.ToList();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。