Razor Pages Partial Views with routing - asp.net-core

I'd like to have Razor Pages as partial views but also being able to get them separately as HTML fragments so I can update them with AJAX.
If I put a #page at the top of my partial view, it gets routed but its model object will be null. If I remove #page, the model will be valid however I can no longer GET the partial view separately.
How can I have the cshtml be routed and have a valid model at the same time? I'm on ASP.NET Core 2.1 and upgrading is unfortunately not an option.

You cannot. Just create a partial view with the HTML you're wanting to share, and then call that partial view in your Razor Page. Then, you can use the partial view directly when you need that.
_MyPartialView.cshtml
#model MyPartialViewModel
<div>Here's my HTML</div>
MyPage.cshtml
#page MyPageModel
<partial name="_MyPartialView" model="Model.MyPartialViewModelInstance" />

If I put a #page at the top of my partial view, it gets routed but its model object will be null. If I remove #page, the model will be valid however I can no longer GET the partial view separately.
Partial Pages or Views are Razor files containing snippets of HTML and server-side code to be included in any number of pages or layouts. Partial pages can be used to break up complex pages into smaller units, thereby reducing the complexity and allowing teams to work on different units concurrently.
Just like standard Razor pages, partial pages support the #model directive specifying the type for the partial's data model. All of the rendering methods have overloaded versions that take a model to be consumed in the partial.
Note that the partial page does not feature an#page directive. That would make the file a full Razor Page and will lead to a NullReferenceExceptionrelated to the model not being declared when the framework attempts to invoke it - because there is no associated PageModel file. You could refer to Partial Pages in a Razor Pages application.

Related

How to know at render time what partials are being used in a Razor page in ASPNET Core?

I have an ASPNET Core (.net6) project with a main page layout that automatically includes styles and scripts in the page bases on the page file name. Example: if you have a page called me/details (the file being me/details.cshtml) and there is a file called wwwroot/me/details.css, a reference to it will be included by my layout page inthe head of the html. The same happens for script files, but at the end of the body
I wanted to do the same for partials views. I want to include specific styles and script file references in the html for any partial views being rendered in the page, without extra code in the partials. Is there any way to know at render time, or at least at the middleware level, what partial views are being used in a page?

Best Practice to display text label on a .NetCore Razor page

Is it best practice for ALL text on a .Net Core Razor webpage to be injected with Model Binding (Even on a static page), or should I only inject text which may need to change dynamically at runtime?
E.g. My Index.cshtml page has a h1 title as per below. Is this considered bad practice or is it ok?
<h1 class="block-title-text" localize-content>A Fun Title</h1>
Thanks. Just trying to get my head around Razor and .Net Core.
This if fine, in general you should keep user interface elements in the view (or the .cshtml file for Razor Pages). See benefits of using views for more details, which among other things includes:
The parts of the app are loosely coupled. You can build and update the app's views separately from the business logic and data access components. You can modify the views of the app without necessarily having to update other parts of the app.
Just realised something which is obvious in hindsight. By injecting the strings using Model Binding instead of placing them into the HTML as above, it allows the incorporation of unit tests around those strings.

what is the difference between razorview and razorlayout in aspnet core

I used razor pages and want to create a razor page partial view.
I saw two options one razor view and another razor layout, what is different between the two? Which is better for a partial view?
It doesn't really matter which template you use to create a partial for Razor Pages. In both cases, you will need to replace the existing content and rename the file. A partial is just a single Razor file that doesn't have an #page directive.
You could also use the ViewStart and View Imports templates. The Razor Page template could also be used, but you would also need to delete the PageModel class file that gets generated.
More about Partials in Razor Pages here: https://www.learnrazorpages.com/razor-pages/partial-pages

Include controller and model source code of Razor Class Library

Is it possible to view and include the source code for the controller and models of the Identity package in Asp.Net Core 3 into my VS project?
I have scaffolded the package but it currently shows only the view files.
There is no controller or model code. The Identity default UI uses Razor Pages. With Razor Pages, there's a code-behind (.cshtml.cs), which has methods similar to controller actions, called handlers, and the model is actually a PageModel and is the entire backing class for the view.
The views should have a little arrow to the left of them, which you can expand to show the code-behind.

ASP.Net Core route template behaviour

I've seen in some sample code that a route template ("{id:int}") on top of razor page causes the links to that page to use another pattern:
https://localhost/Movies/Edit/6
instead of
https://localhost/Movies/Details?id=6
My question is how asp.net manages to change all the links to that pattern, does it know about that page before rendering it?
Does it collaborate with other pages when processing a page?
When the application first starts, a collection of attribute routes are built. The routes are built for any Razor file with an #page directive in the root Pages folder, and for any other routes that have been defined via PageRouteConventions.
When you use the Url helper to generate links, or the anchor tag helper (which uses the Url helper behind the scenes), the link that gets generated is based on the attribute route that was built for the page that you pass to the helper.
In attribute routing, route parameters are added as segments in the URL, which is why the values are not appended as query string values. If you prefer query strings, don't declare route values as part of the #page directive.
Run the dotnet publish -c Release command and take a look inside the bin/Release folder.
You will not find your .cshtml files with html in them. What happaned where did all the html go? And how does this relate to the question?
You gotta remember that cshtml will endup being your regular ol' c# and all that fancy razor templating syntax end's up being c#. This process has many names and transpilation is one of them performed by transpilers.
Okey so now that we can safely assume that when you have a Index.cshtml file it will get populated in to some sort of an object, let's call it RazorPage.cs this will just store all the configuration for this page. Now let's say this index page is living in a folder called Home now we can have a dictionary Dictionary<string, RazorPage> and let's say that the key will be "/Home/Index". Following along based on transpiled #page "{id:int}" syntax, it might generate a template string for the route and store that in the RazorPage in a RouteTemplate parameter.
So when you use asp-page tag helper it will find the correct RazorPage and it can know the template for the url, populating it with the values you provided.
I haven't seen the actual implementation this is just my guess.
My question is how asp.net manages to change all the links to that pattern, does it know about that page before rendering it?
Yes it knows everything about the page at run time. Most likely the services.AddMvc() service takes care of loading in all the razor pages / views / controllers, at startup.
Does it collaborate with other pages when processing a page?
Highly likely no, unless you mean components/layouts/partials. It will however struggle to resolve a page if you have identical route for 2 pages.