【问题标题】:How to invoke a View Component from controller如何从控制器调用视图组件
【发布时间】:2016-11-24 00:11:17
【问题描述】:

是否可以从控制器调用视图组件并将其呈现为字符串?我真的在为此寻找一些代码示例。任何帮助将不胜感激。

【问题讨论】:

  • 视图组件是什么意思,当您说字符串时,您是想在视图中呈现字符串还是将视图组件呈现为字符串?
  • 查看 mvc 6 中的组件:asp.net/vnext/overview/aspnet-vnext/vc

标签: asp.net-core asp.net-core-mvc


【解决方案1】:

从 beta7 开始,现在可以直接从控制器返回 ViewComponent。检查the announcement的MVC/Razor部分

MVC 中新增的 ViewComponentResult 使得返回结果变得容易 来自动作的 ViewComponent。这使您可以轻松地暴露 ViewComponent 作为独立端点的逻辑。

所以现在返回示例视图组件的代码只需:

public class HomeController : Controller
{
    public IActionResult Index()
    {
        return ViewComponent("My");
    }
}

【讨论】:

    【解决方案2】:

    请参考official ASP.NET article on ViewComponent的例子

    在他们的示例中,视图组件直接从控制器调用如下:

    public IActionResult IndexVC()
    {
        return ViewComponent("PriorityList", new { maxPriority = 3, isDone = false });
    }
    

    【讨论】:

      【解决方案3】:

      您可以这样做,但您必须应用以下内容,因为它是由 DefaultViewComponentHelper 呈现的。

      您必须创建此实例并创建您需要 IViewComponentSelector 和 IViewComponentInvokerFactory。

      为此,我做了以下事情。

      public class HomeController : Controller
          {
              Microsoft.AspNet.Mvc.DefaultViewComponentHelper helper = null;
              Microsoft.AspNet.Mvc.Razor.RazorView razorView = null;
              public HomeController(IViewComponentSelector selector,IViewComponentInvokerFactory factory,IRazorPageFactory razorPageFactory,IRazorPageActivator pageActivator,IViewStartProvider viewStartProvider)
              {
                  helper = new DefaultViewComponentHelper(selector, factory);
                  razorView = new Microsoft.AspNet.Mvc.Razor.RazorView(razorPageFactory, pageActivator, viewStartProvider);           
              }
              public IActionResult Index()
              {                  
                  ViewContext context = new ViewContext(ActionContext, razorView, ViewData, null);
                  helper.Contextualize(context);
                  string st1 = helper.Invoke("My", null).ToString();
                  return View();
              }
      }
      

      这是我的示例视图组件。

       public class MyViewComponent : ViewComponent
          {     
      
              public MyViewComponent()
              {
      
              }
      
              public IViewComponentResult Invoke()
              {
                  return Content("This is test");
              }
          }
      

      【讨论】:

      【解决方案4】:

      这是我创建的一个标签助手,用于通过类似 HTML 的语法嵌入组件。像这样从 TagHelper 调用应该与从 Controller 调用非常匹配。

      ViewComponent 标签助手

      using System.Threading.Tasks;
      using Microsoft.AspNetCore.Mvc;
      using Microsoft.AspNetCore.Mvc.Rendering;
      using Microsoft.AspNetCore.Mvc.ViewComponents;
      using Microsoft.AspNetCore.Mvc.ViewFeatures;
      using Microsoft.AspNetCore.Razor.TagHelpers;
      
      
      namespace TagHelperSamples.Web
      {
          [HtmlTargetElement("component")]
          public class ComponentTagHelper : TagHelper
          {
              private DefaultViewComponentHelper _componentHelper;
      
              [HtmlAttributeName("name")]
              public string Name { get; set; }
      
              [HtmlAttributeName("params")]
              public object Params { get; set; }
      
              [ViewContextAttribute] // inform razor to inject
              public ViewContext ViewContext { get; set; }
      
              public ComponentTagHelper(IViewComponentHelper componentHelper)
              {
                  _componentHelper = componentHelper as DefaultViewComponentHelper;
              }
      
              public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
              {       
                  _componentHelper.Contextualize(ViewContext);
      
                  output.Content.AppendHtml(
                      await _componentHelper.InvokeAsync(Name, Params)
                  );
              }
          }
      }
      

      用法

      <component name="RecentComments" params="new { take: 5, random: true }"></component>
      

      【讨论】:

        【解决方案5】:

        dotnetstep 答案中的代码已针对 MVC 6.0.0-beta4 (VS2015 RC) 更新:

        public class HomeController : Controller
            {
                Microsoft.AspNet.Mvc.ViewComponents.DefaultViewComponentHelper helper = null;
        
                public HomeController(IViewComponentDescriptorCollectionProvider descriptorProvider, IViewComponentSelector selector, IViewComponentInvokerFactory invokerFactory)
                {
                    helper = new DefaultViewComponentHelper(descriptorProvider, selector, invokerFactory);
                }
                public IActionResult Index()
                {                  
                    ViewContext context = new ViewContext(ActionContext, null, ViewData, null, null);
                    helper.Contextualize(context);
                    string st1 = helper.Invoke("My", null).ToString();
                    return View();
                }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-03-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-08-07
          • 1970-01-01
          相关资源
          最近更新 更多