Conditionally call ViewComponent inside Razor Page











up vote
1
down vote

favorite












I'm new to Razor Pages and View Components and I'm cleary failing to put my head around the concepts:



I have a Example page, this page is rendered inside a _Layout, like the following:



@page "{value1?}/{value2?}"
@model MyProject.Pages.ExampleModel
@{
ViewData["Title"] = "Example";
}


Now I need to call a ViewComponent conditionally based on value1 and value2:



public class ExampleModel : PageModel
{
public async Task<IActionResult> OnGetAsync(string value1, string value2)
{
// this contains a lot of logic, db access etc, and passing objects to the component, but I'm abbreviating

if (value1 == null && value2 == null)
{
return this.ViewComponent(nameof(SomeComponent));
}
else
{
return this.ViewComponent(nameof(SomeOtherComponent));
}

// return Page();
}
}


This is the extension I'm using to call the components:



public static class PageModelExtensions
{
public static ViewComponentResult ViewComponent(this PageModel pageModel, string componentName, object arguments)
{
return new ViewComponentResult
{
ViewComponentName = componentName,
Arguments = arguments,
ViewData = pageModel.ViewData,
TempData = pageModel.TempData
};
}
}


This is working, but because I'm not calling return Page(), the component is being rendered without calling _Layout. How should I approach this?










share|improve this question




























    up vote
    1
    down vote

    favorite












    I'm new to Razor Pages and View Components and I'm cleary failing to put my head around the concepts:



    I have a Example page, this page is rendered inside a _Layout, like the following:



    @page "{value1?}/{value2?}"
    @model MyProject.Pages.ExampleModel
    @{
    ViewData["Title"] = "Example";
    }


    Now I need to call a ViewComponent conditionally based on value1 and value2:



    public class ExampleModel : PageModel
    {
    public async Task<IActionResult> OnGetAsync(string value1, string value2)
    {
    // this contains a lot of logic, db access etc, and passing objects to the component, but I'm abbreviating

    if (value1 == null && value2 == null)
    {
    return this.ViewComponent(nameof(SomeComponent));
    }
    else
    {
    return this.ViewComponent(nameof(SomeOtherComponent));
    }

    // return Page();
    }
    }


    This is the extension I'm using to call the components:



    public static class PageModelExtensions
    {
    public static ViewComponentResult ViewComponent(this PageModel pageModel, string componentName, object arguments)
    {
    return new ViewComponentResult
    {
    ViewComponentName = componentName,
    Arguments = arguments,
    ViewData = pageModel.ViewData,
    TempData = pageModel.TempData
    };
    }
    }


    This is working, but because I'm not calling return Page(), the component is being rendered without calling _Layout. How should I approach this?










    share|improve this question


























      up vote
      1
      down vote

      favorite









      up vote
      1
      down vote

      favorite











      I'm new to Razor Pages and View Components and I'm cleary failing to put my head around the concepts:



      I have a Example page, this page is rendered inside a _Layout, like the following:



      @page "{value1?}/{value2?}"
      @model MyProject.Pages.ExampleModel
      @{
      ViewData["Title"] = "Example";
      }


      Now I need to call a ViewComponent conditionally based on value1 and value2:



      public class ExampleModel : PageModel
      {
      public async Task<IActionResult> OnGetAsync(string value1, string value2)
      {
      // this contains a lot of logic, db access etc, and passing objects to the component, but I'm abbreviating

      if (value1 == null && value2 == null)
      {
      return this.ViewComponent(nameof(SomeComponent));
      }
      else
      {
      return this.ViewComponent(nameof(SomeOtherComponent));
      }

      // return Page();
      }
      }


      This is the extension I'm using to call the components:



      public static class PageModelExtensions
      {
      public static ViewComponentResult ViewComponent(this PageModel pageModel, string componentName, object arguments)
      {
      return new ViewComponentResult
      {
      ViewComponentName = componentName,
      Arguments = arguments,
      ViewData = pageModel.ViewData,
      TempData = pageModel.TempData
      };
      }
      }


      This is working, but because I'm not calling return Page(), the component is being rendered without calling _Layout. How should I approach this?










      share|improve this question















      I'm new to Razor Pages and View Components and I'm cleary failing to put my head around the concepts:



      I have a Example page, this page is rendered inside a _Layout, like the following:



      @page "{value1?}/{value2?}"
      @model MyProject.Pages.ExampleModel
      @{
      ViewData["Title"] = "Example";
      }


      Now I need to call a ViewComponent conditionally based on value1 and value2:



      public class ExampleModel : PageModel
      {
      public async Task<IActionResult> OnGetAsync(string value1, string value2)
      {
      // this contains a lot of logic, db access etc, and passing objects to the component, but I'm abbreviating

      if (value1 == null && value2 == null)
      {
      return this.ViewComponent(nameof(SomeComponent));
      }
      else
      {
      return this.ViewComponent(nameof(SomeOtherComponent));
      }

      // return Page();
      }
      }


      This is the extension I'm using to call the components:



      public static class PageModelExtensions
      {
      public static ViewComponentResult ViewComponent(this PageModel pageModel, string componentName, object arguments)
      {
      return new ViewComponentResult
      {
      ViewComponentName = componentName,
      Arguments = arguments,
      ViewData = pageModel.ViewData,
      TempData = pageModel.TempData
      };
      }
      }


      This is working, but because I'm not calling return Page(), the component is being rendered without calling _Layout. How should I approach this?







      c# asp.net-core






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 10 at 16:22









      Kirk Larkin

      16.9k33452




      16.9k33452










      asked Nov 10 at 16:17









      lolol

      2,57622643




      2,57622643
























          1 Answer
          1






          active

          oldest

          votes

















          up vote
          1
          down vote



          accepted










          If you want to render a View Component from within a Razor Page like this, one option is to specify the name of said View Component in your PageModel class and then use Component.InvokeAsync in the correpsonding .cshtml file. Here's what that might look like:



          Example.cshtml.cs



          public class ExampleModel : PageModel
          {
          public string ViewComponentName { get; set; }

          public async Task<IActionResult> OnGetAsync(string value1, string value2)
          {
          ...

          if (value1 == null && value2 == null)
          ViewComponentName = nameof(SomeComponent);
          else
          ViewComponentName = nameof(SomeOtherComponent);

          return Page();
          }
          }


          Example.cshtml



          @page "{value1?}/{value2?}"
          @model MyProject.Pages.ExampleModel

          ...

          @await Component.InvokeAsync(Model.ViewComponentName)


          In Example.cshtml.cs, ViewComponentName is a new property that (unsurprisingly) represents the name of the View Component that should be rendered as part of the page, which is realised in Example.cshtml using Component.InvokeAsync.






          share|improve this answer

















          • 1




            Oh, I see. I can see how to apply the same method using parameters Component.InvokeAsync(Model.ViewComponentName, Model.SomeParameter). Is this right? Thx.
            – lolol
            Nov 10 at 16:36












          • Yes, that looks right.
            – Kirk Larkin
            Nov 10 at 16:37











          Your Answer






          StackExchange.ifUsing("editor", function () {
          StackExchange.using("externalEditor", function () {
          StackExchange.using("snippets", function () {
          StackExchange.snippets.init();
          });
          });
          }, "code-snippets");

          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "1"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });














           

          draft saved


          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53240883%2fconditionally-call-viewcomponent-inside-razor-page%23new-answer', 'question_page');
          }
          );

          Post as a guest
































          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes








          up vote
          1
          down vote



          accepted










          If you want to render a View Component from within a Razor Page like this, one option is to specify the name of said View Component in your PageModel class and then use Component.InvokeAsync in the correpsonding .cshtml file. Here's what that might look like:



          Example.cshtml.cs



          public class ExampleModel : PageModel
          {
          public string ViewComponentName { get; set; }

          public async Task<IActionResult> OnGetAsync(string value1, string value2)
          {
          ...

          if (value1 == null && value2 == null)
          ViewComponentName = nameof(SomeComponent);
          else
          ViewComponentName = nameof(SomeOtherComponent);

          return Page();
          }
          }


          Example.cshtml



          @page "{value1?}/{value2?}"
          @model MyProject.Pages.ExampleModel

          ...

          @await Component.InvokeAsync(Model.ViewComponentName)


          In Example.cshtml.cs, ViewComponentName is a new property that (unsurprisingly) represents the name of the View Component that should be rendered as part of the page, which is realised in Example.cshtml using Component.InvokeAsync.






          share|improve this answer

















          • 1




            Oh, I see. I can see how to apply the same method using parameters Component.InvokeAsync(Model.ViewComponentName, Model.SomeParameter). Is this right? Thx.
            – lolol
            Nov 10 at 16:36












          • Yes, that looks right.
            – Kirk Larkin
            Nov 10 at 16:37















          up vote
          1
          down vote



          accepted










          If you want to render a View Component from within a Razor Page like this, one option is to specify the name of said View Component in your PageModel class and then use Component.InvokeAsync in the correpsonding .cshtml file. Here's what that might look like:



          Example.cshtml.cs



          public class ExampleModel : PageModel
          {
          public string ViewComponentName { get; set; }

          public async Task<IActionResult> OnGetAsync(string value1, string value2)
          {
          ...

          if (value1 == null && value2 == null)
          ViewComponentName = nameof(SomeComponent);
          else
          ViewComponentName = nameof(SomeOtherComponent);

          return Page();
          }
          }


          Example.cshtml



          @page "{value1?}/{value2?}"
          @model MyProject.Pages.ExampleModel

          ...

          @await Component.InvokeAsync(Model.ViewComponentName)


          In Example.cshtml.cs, ViewComponentName is a new property that (unsurprisingly) represents the name of the View Component that should be rendered as part of the page, which is realised in Example.cshtml using Component.InvokeAsync.






          share|improve this answer

















          • 1




            Oh, I see. I can see how to apply the same method using parameters Component.InvokeAsync(Model.ViewComponentName, Model.SomeParameter). Is this right? Thx.
            – lolol
            Nov 10 at 16:36












          • Yes, that looks right.
            – Kirk Larkin
            Nov 10 at 16:37













          up vote
          1
          down vote



          accepted







          up vote
          1
          down vote



          accepted






          If you want to render a View Component from within a Razor Page like this, one option is to specify the name of said View Component in your PageModel class and then use Component.InvokeAsync in the correpsonding .cshtml file. Here's what that might look like:



          Example.cshtml.cs



          public class ExampleModel : PageModel
          {
          public string ViewComponentName { get; set; }

          public async Task<IActionResult> OnGetAsync(string value1, string value2)
          {
          ...

          if (value1 == null && value2 == null)
          ViewComponentName = nameof(SomeComponent);
          else
          ViewComponentName = nameof(SomeOtherComponent);

          return Page();
          }
          }


          Example.cshtml



          @page "{value1?}/{value2?}"
          @model MyProject.Pages.ExampleModel

          ...

          @await Component.InvokeAsync(Model.ViewComponentName)


          In Example.cshtml.cs, ViewComponentName is a new property that (unsurprisingly) represents the name of the View Component that should be rendered as part of the page, which is realised in Example.cshtml using Component.InvokeAsync.






          share|improve this answer












          If you want to render a View Component from within a Razor Page like this, one option is to specify the name of said View Component in your PageModel class and then use Component.InvokeAsync in the correpsonding .cshtml file. Here's what that might look like:



          Example.cshtml.cs



          public class ExampleModel : PageModel
          {
          public string ViewComponentName { get; set; }

          public async Task<IActionResult> OnGetAsync(string value1, string value2)
          {
          ...

          if (value1 == null && value2 == null)
          ViewComponentName = nameof(SomeComponent);
          else
          ViewComponentName = nameof(SomeOtherComponent);

          return Page();
          }
          }


          Example.cshtml



          @page "{value1?}/{value2?}"
          @model MyProject.Pages.ExampleModel

          ...

          @await Component.InvokeAsync(Model.ViewComponentName)


          In Example.cshtml.cs, ViewComponentName is a new property that (unsurprisingly) represents the name of the View Component that should be rendered as part of the page, which is realised in Example.cshtml using Component.InvokeAsync.







          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Nov 10 at 16:32









          Kirk Larkin

          16.9k33452




          16.9k33452








          • 1




            Oh, I see. I can see how to apply the same method using parameters Component.InvokeAsync(Model.ViewComponentName, Model.SomeParameter). Is this right? Thx.
            – lolol
            Nov 10 at 16:36












          • Yes, that looks right.
            – Kirk Larkin
            Nov 10 at 16:37














          • 1




            Oh, I see. I can see how to apply the same method using parameters Component.InvokeAsync(Model.ViewComponentName, Model.SomeParameter). Is this right? Thx.
            – lolol
            Nov 10 at 16:36












          • Yes, that looks right.
            – Kirk Larkin
            Nov 10 at 16:37








          1




          1




          Oh, I see. I can see how to apply the same method using parameters Component.InvokeAsync(Model.ViewComponentName, Model.SomeParameter). Is this right? Thx.
          – lolol
          Nov 10 at 16:36






          Oh, I see. I can see how to apply the same method using parameters Component.InvokeAsync(Model.ViewComponentName, Model.SomeParameter). Is this right? Thx.
          – lolol
          Nov 10 at 16:36














          Yes, that looks right.
          – Kirk Larkin
          Nov 10 at 16:37




          Yes, that looks right.
          – Kirk Larkin
          Nov 10 at 16:37


















           

          draft saved


          draft discarded



















































           


          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53240883%2fconditionally-call-viewcomponent-inside-razor-page%23new-answer', 'question_page');
          }
          );

          Post as a guest




















































































          Popular posts from this blog

          Xamarin.iOS Cant Deploy on Iphone

          Glorious Revolution

          Dulmage-Mendelsohn matrix decomposition in Python