asp net core activate a controller and action with href? [duplicate] - asp.net-mvc

I'm currently trying to make a website in ASP.NET Core MVC. In my layout page, I'm making a navigation bar to access all of the actions that can be reached through my controllers. I am however unable to create useful links.
<ul>
<li>Home</li>
<li>Index</li>
</ul>
My problem with this is that I still need the controller before the links and if I put the controller in front of the action like this
<ul>
<li>Home</li>
<li>What We've Done</li>
</ul>
When I click on one link and then the other, the link will end up being "myurl/home/home/page".
How can I create the link to only link to the exact page I want to?

You should use the anchor tag helper to build the markup for the link
<a asp-action="index" asp-controller="home">Home</a>
This will generate the correct relative path to the index action as the href property value of the anchor tag.

Related

Thymeleaf editing th:field before action

I have a simple pagination that looks like
<ul class="pagination justify-content-end" th:field="*{page}">
<li class="page-item page-item disabled">
<a class="page-link" href="action">1</a>
</li>
</ul>
I would get the following behaviour with Thymeleaf. Clicking on the page and before submitting the action, the value of the th:field associated with the pagination should be changed by setting it to the th:value of the selected page. In other words, clicking on the page number should change the value of "*{page}" and then call the method. Is there any way to do that, for example, combining th:onclick with th:action?
Thymeleaf is a rendering engine, as such it can do nothing once the page is served to the end user. At best u can fill variables into javascript when rendering to achieve the desired result.
As for your described functionality the given code is far to limited or faulty to give a suggestion for a javascript solution, for one th:field on a non-input element doesn't do much. Also the shown href is just a simple href that doesnt interact in any way with the encapsulating th:field.

Linking to a specified section of a page using a TagHelper in MVC Core

I have a View called Legal controlled by HomeController
I can link to this page using the anchor tag or with a TagHelper:
<a asp-controller="Home" asp-action="Legal">Cookie policy</a>
In the html in the View Legal there is a section with id="cookies"
With a regular anchor tag, I can have the page automatically scroll there if I do:
Cookie policy
When I try doing the same in the TagHelper asp-action="Legal#cookies", the anchor is generated with href="/Legal%23cookies", which does not get picked up by my controller.
I've read in this related question how this can be solved using Razor in a regular anchor tag. However, I'd like to do this using a TagHelper. Is there a way to do this?
You can use asp-fragment attribute. It defines a URL fragment to append to the URL after #.
<a asp-controller="Home" asp-action="Legal" asp-fragment="cookies">Cookie policy</a>
It will generate HTML:
Cookie policy

Adding element ID to navigation items in Grails Platform Core Navigation API

Is it possible to add HTML attributes such as id or class to each menu item generated by the Grails Platform Core Navigation API?
Perhaps something similar to:
home(controller: 'home', action:'index', titleText:'Home', elementId: 'navHome')
I am writing some functional tests which use the generated links. However, the link text (and possibly the URLs) might change. Using an ID would make the tests easier to maintain.
The Navigation API provides the ability to add additional values via the data map and custom menu item rendering.
Example:
Step 1
Add the data map to the menu item definition in config/AppNavigation.groovy.
home(controller: 'home', action:'index', titleText:'Home', data: [elementId: 'navHome'])
Step 2
Reference the data map using item.data.* in the GSP file.
<nav:primary scope="some scope" custom="true">
<li>
<p:callTag
tag="g:link"
attrs="${linkArgs + [class:active ? 'active' : ''] + [elementId:item.data.elementId]}"
><nav:title item="${item}"/></p:callTag>
</li>
</nav:primary>
This will result in the following HTML:
<ul class="nav primary">
<li>
Home
</li>
</ul>
See the nav:menu tag documentation in the Navigation API documentation for more information.

Use Bootstrap Navbar choice in controller?

All, I'm trying to use the Bootstrap Navbar user choice to control the filtering of posts shown to the user.
The model includes an 'expired' field which is a date-time type.
Three choices are: All (no filtering), Open (show only open issues) and Closed (show closed).
Is there a way to do this without defining three different index.html.erb variants (DRY problem). The filter should show only closed issues if #post.expired < Time.now .. etc.
Stated alternately - can controller 'know' what the user chose, although Navbar, as i am using it, is simply a fancy navigation toolbar?
Thanks for any advice.
Typically this is done by including a parameter in the request, and looking for that parameter in the controller. The bootstrap navbar uses regular anchor links so you should be able to add parameters easily to them (modified example from the doc):
<div class="navbar">
<div class="navbar-inner">
<a class="brand" href="/some_url">List</a>
<ul class="nav">
<li>All</li>
<li>Open</li>
<li>Closed</li>
</ul>
</div>
</div>
You can read the filter parameter in the controller by accessing the value of params[:filter].

The Best Way to Highlight or Change Current Menu Item CSS Class in MVC

I have read a few articles as I was searching for a solution. They all seemed to favor a hard-coded or HTML Helper alternative; however, I wanted something simple and database driven. This is my best solution (submitted as an answer, by me).
Here are some other articles' solutions:
An easy way to set the active tab using controllers and a usercontrol in ASP.NET MVC?
asp.net mvc and css: Having menu tab stay highlighted on selection
ASP.NET MVC: Tabs ASCX - Adjust CSS class based on current page?
Just pass a TempData down from one of your controllers like this:
TempData("CurrentPage") = "Nutrition"
Then, in your View add a conditional like this:
<ul>
#For Each item In Model
Dim currentItem = item
If (Not String.IsNullOrEmpty(TempData("CurrentPage")) And TempData("CurrentPage") = currentItem.NAV_Element) Then
#<li><a class="current" href="#Html.DisplayFor(Function(modelItem) currentItem.NAV_Destination)">#Html.DisplayFor(Function(modelItem) currentItem.NAV_Element)</a></li>
Else
#<li>#Html.DisplayFor(Function(modelItem) currentItem.NAV_Element)</li>
End If
Next
</ul>
I have accomplished this in the past by using the route values to generate a href and then setting the parent tab to active based on that.
This is a bootstrap flavoured version:
<ul class="nav nav-tabs">
<li>Some page</li>
<li>Some other Page</li>
</ul>
<script type="text/javascript">
$(function(){
$('a[href="#Url.Action(ViewContext.RouteData.Values)"]').parents("li").addClass("active");
};
</script>
Si
I know I am too late to answer this but if you are using ASP MVC and looking for highlighting Menu items using controller and action, here is the solution which is working perfectly fine for me -
<li> <i class="fa fa-user-plus"></i> <span>Signup</span> </li>

Resources