In Blazor I have an <a>
element that has both a href
and an onclick
method:
<a href="" onclick="@(() => ChangePage(_someObject))">Test</a>
onclick
calls this method:
private bool ChangePage(object objectToDisplay)
{
_currentObject = objectToDisplay;
StateHasChanged();
return false;
}
Normally in JavaScript returning false from the event method stops the subsequent navigation to the link in the href
but this doesn't seem to be working with my code above.
How can I stop Blazor changing the page to the root url after the link is clicked?
(The obvious answer here would be to remove the href
altogether, but I'm using the link in a bootstrap Pill and removing the href
stops the Pills working)
Other things I've tried that didn't work:
- Changing the
<a>
element to a span and setting thedata-target
attribute, but that stops the Pills rendering properly. - Adding
return
into theonclick
event (as per this answer):onclick="return @(() => ChangePage(_overviewModel))"
but that doesn't compile. - Adding
return
after theonclick
event:onclick="@(() => ChangePage(_overviewModel)); return false;"
but that doesn't compile either. - using a Blazor
NavLink
component<NavLink href="" onclick="@(() => ChangePage(_someObject))">NavLink</NavLink>
I had the same problem, and didnt like the idea of adding the extra onclick:preventDefault
I also want to avoid adding javascript and seeing how much blazor and C# I can use.
So i used a button instead. I get the cursor on hover over and it acting as I would like.
This has been finally fixed.
Currently you can't control event propagation in Blazor. This feature will be available in the next preview, which is preview 6. You can see the relevant issue on GitHub, https://github.com/aspnet/AspNetCore/issues/5545.
As you have found the pills in bootstrap are styled based on the elements used hence why swapping the a tag for another breaks things.
I think your options right now are either wait for preview 6 or rewrite the pills yourself.
You could try adding the javascript void method to the href.
<a href="javascript: void(0);" onclick="@(() => ChangePage(_someObject))">Test</a>
The way to do it after release 3.1 of ASP.NET Core seems to be