Latest commit

History

42 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

AngularMiddleware

Build status

Middleware for facilitating support of true Angular client-side applications in ASP.NET 5.

AngularMiddleware allows the development of Angular (or any other JavaScript framework) client-side application ASP.NET 5 without the need for controllers and views.

Problem

Typically, with ASP.NET web applications, there are a few requirements for supporting Angular and other JavaScript frameworks.

  1. Unnecessary controllers and views that are serving static pages

  2. Creating "catch-all" routes:

    routes.MapRoute("","{url}",new{controller="Home",Action="Index"});

While this may work in cases where you prefer using partial views and perform additional ViewModel binding, this isn't the cleanest approach to accomplishing a true client-side application.

In reality, one would prefer to utilize the ASP.NET framework for it's WebApi and REST services while leaving all presentation, databinding and routing strictly on the client.

Push State

Initially, routing was performed by appending a "hash" or "hashbang" to the end of URLs. These URLs utilize the fragment portion of the URL as if it were an extension of the path name (e.g. #/user/1234). This was great for older browsers (and still should be used if you need to support older browsers), but is no longer necessary due to the arrival of the HTML5 History API. Continuing to use hashes should also be stopped due to the fact that hashes originally signified an anchor within the document.

Because 1) using hashes and URL fragments should not be used for routing; 2) we don't want to create catch-all routes; 3) we don't need server-side controllers and views; 4) we still wish to use WebApi; and, 5) we need to be able to serve up static files, AngularMiddleware was created.

Approach

My first attempt at hooking into the request pipeline is shown in a question I posted on StackOverflow. The logic was very elementary to simply ignore any request whose path began with /api - allow MVC to serve those. All other requests would serve index.html in the root directory. I posted the question to see if anyone knew of anything built-in the MVC 5. I assumed that because Microsoft was pushing Angular and client-side development so much, they would have provided a mechanism of sorts. Unfortunately, not.

One of the responses I received pointed me to Angular's ui-router documentation on GitHub for removing the hash (e.g. html5mode). For ASP.NET/IIS, there were two possibilities...

  1. Azure IIS Rewrites
  2. ASP.Net C# Rewrites

In the case of ASP.NET 5 and DNX, neither are a good fit. The web.cofing, while it can be modified, should be only contain a couple of entries for the httpPlatformHandler in order to support the new hosting model. Similarly, Global.asax has been deprecated. For ASP.NET 5 web applications, almost all configurations have been moved into various json configuration files; and, application events should be managed in the request pipe configured by the Startup class.

Therefore, AngularMiddleware provides a solution to the issues listed above and offers additional configurations.

Installation

AngularMiddleware should be listed in your project's dependencies within the project.json configuration file. NuGet will download the libaries and include them in your project automatically.

{
..."dependencies":{"AngularMiddleware":"version"}
...}

Basic Usage

Startup.cs
Add a using reference for AngularMiddleware at the top of your StartUp class file. Then, add AngularMiddleware to the Configure() method.

publicvoidConfigure(IApplicationBuilderapp,IHostingEnvironmentenv){
...app.UseAngular();
...}

This is the basic configuration and, assuming that you have index.html in your wwwroot directory, all should work.

Advanced Options

Different Default Document
In the case you choose a different document as your default (e.g. instead of index.html), you can tell AngularMiddleware what that default document should be.

app.UseAngular(routes =>{routes.DefaultRoute="default.html";});

Route/Page Redirection
Let's say that you wish to redirect all requests for ~/administrators.html, ~/hr_users.html, and ~/marketing_users.html to ~/users.html.

app.UseAngular(routes =>{routes.MapAngularRoute(new[]{"administrators.html","hr_users.html","marketing_users.html"},"users.html");});

Ingore Specific Requests
AngularMiddleware also allows you to ignore specific requests.

app.UseAngular(routes =>{routes.IgnoreAngularRoute("admin.html");});

NOTE: IgnoreAngularRoute should only be used in rare cases that the pipeline doesn't service a request properly. If you are using MVC middleware and you've defined routes (e.g. legacy routing or attribute routing), those routes will be ignored by AngularMiddleware and be served, instead, by the MVC middleware. Likewise, if you are using either/both of the DefaultFiles and StaticFiles middleware, unless a specific route is mapped (i.e. rewritten) or ignored, these middleware will serve static files - including the default files (if DefaultFiles middleware is used).

License

AngularMiddleware is released under the MIT License.

Development

The AngularMiddleware project is developed and maintained by Joshua Davis.

About

Middleware for facilitating support of true Angular client-side applications in ASP.NET 5.

Resources

Stars

4 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all \u003cpre\u003e\u003ccode\u003e blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks"); } } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); } })(); (function(){ try { var __m = "github.com"; var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

42 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

AngularMiddleware

Build status

Middleware for facilitating support of true Angular client-side applications in ASP.NET 5.

AngularMiddleware allows the development of Angular (or any other JavaScript framework) client-side application ASP.NET 5 without the need for controllers and views.

Problem

Typically, with ASP.NET web applications, there are a few requirements for supporting Angular and other JavaScript frameworks.

  1. Unnecessary controllers and views that are serving static pages

  2. Creating "catch-all" routes:

    routes.MapRoute("","{url}",new{controller="Home",Action="Index"});

While this may work in cases where you prefer using partial views and perform additional ViewModel binding, this isn't the cleanest approach to accomplishing a true client-side application.

In reality, one would prefer to utilize the ASP.NET framework for it's WebApi and REST services while leaving all presentation, databinding and routing strictly on the client.

Push State

Initially, routing was performed by appending a "hash" or "hashbang" to the end of URLs. These URLs utilize the fragment portion of the URL as if it were an extension of the path name (e.g. #/user/1234). This was great for older browsers (and still should be used if you need to support older browsers), but is no longer necessary due to the arrival of the HTML5 History API. Continuing to use hashes should also be stopped due to the fact that hashes originally signified an anchor within the document.

Because 1) using hashes and URL fragments should not be used for routing; 2) we don't want to create catch-all routes; 3) we don't need server-side controllers and views; 4) we still wish to use WebApi; and, 5) we need to be able to serve up static files, AngularMiddleware was created.

Approach

My first attempt at hooking into the request pipeline is shown in a question I posted on StackOverflow. The logic was very elementary to simply ignore any request whose path began with /api - allow MVC to serve those. All other requests would serve index.html in the root directory. I posted the question to see if anyone knew of anything built-in the MVC 5. I assumed that because Microsoft was pushing Angular and client-side development so much, they would have provided a mechanism of sorts. Unfortunately, not.

One of the responses I received pointed me to Angular's ui-router documentation on GitHub for removing the hash (e.g. html5mode). For ASP.NET/IIS, there were two possibilities...

  1. Azure IIS Rewrites
  2. ASP.Net C# Rewrites

In the case of ASP.NET 5 and DNX, neither are a good fit. The web.cofing, while it can be modified, should be only contain a couple of entries for the httpPlatformHandler in order to support the new hosting model. Similarly, Global.asax has been deprecated. For ASP.NET 5 web applications, almost all configurations have been moved into various json configuration files; and, application events should be managed in the request pipe configured by the Startup class.

Therefore, AngularMiddleware provides a solution to the issues listed above and offers additional configurations.

Installation

AngularMiddleware should be listed in your project's dependencies within the project.json configuration file. NuGet will download the libaries and include them in your project automatically.

{
..."dependencies":{"AngularMiddleware":"version"}
...}

Basic Usage

Startup.cs
Add a using reference for AngularMiddleware at the top of your StartUp class file. Then, add AngularMiddleware to the Configure() method.

publicvoidConfigure(IApplicationBuilderapp,IHostingEnvironmentenv){
...app.UseAngular();
...}

This is the basic configuration and, assuming that you have index.html in your wwwroot directory, all should work.

Advanced Options

Different Default Document
In the case you choose a different document as your default (e.g. instead of index.html), you can tell AngularMiddleware what that default document should be.

app.UseAngular(routes =>{routes.DefaultRoute="default.html";});

Route/Page Redirection
Let's say that you wish to redirect all requests for ~/administrators.html, ~/hr_users.html, and ~/marketing_users.html to ~/users.html.

app.UseAngular(routes =>{routes.MapAngularRoute(new[]{"administrators.html","hr_users.html","marketing_users.html"},"users.html");});

Ingore Specific Requests
AngularMiddleware also allows you to ignore specific requests.

app.UseAngular(routes =>{routes.IgnoreAngularRoute("admin.html");});

NOTE: IgnoreAngularRoute should only be used in rare cases that the pipeline doesn't service a request properly. If you are using MVC middleware and you've defined routes (e.g. legacy routing or attribute routing), those routes will be ignored by AngularMiddleware and be served, instead, by the MVC middleware. Likewise, if you are using either/both of the DefaultFiles and StaticFiles middleware, unless a specific route is mapped (i.e. rewritten) or ignored, these middleware will serve static files - including the default files (if DefaultFiles middleware is used).

License

AngularMiddleware is released under the MIT License.

Development

The AngularMiddleware project is developed and maintained by Joshua Davis.

About

Middleware for facilitating support of true Angular client-side applications in ASP.NET 5.

Resources

Stars

4 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

42 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

AngularMiddleware

Build status

Middleware for facilitating support of true Angular client-side applications in ASP.NET 5.

AngularMiddleware allows the development of Angular (or any other JavaScript framework) client-side application ASP.NET 5 without the need for controllers and views.

Problem

Typically, with ASP.NET web applications, there are a few requirements for supporting Angular and other JavaScript frameworks.

  1. Unnecessary controllers and views that are serving static pages

  2. Creating "catch-all" routes:

    routes.MapRoute("","{url}",new{controller="Home",Action="Index"});

While this may work in cases where you prefer using partial views and perform additional ViewModel binding, this isn't the cleanest approach to accomplishing a true client-side application.

In reality, one would prefer to utilize the ASP.NET framework for it's WebApi and REST services while leaving all presentation, databinding and routing strictly on the client.

Push State

Initially, routing was performed by appending a "hash" or "hashbang" to the end of URLs. These URLs utilize the fragment portion of the URL as if it were an extension of the path name (e.g. #/user/1234). This was great for older browsers (and still should be used if you need to support older browsers), but is no longer necessary due to the arrival of the HTML5 History API. Continuing to use hashes should also be stopped due to the fact that hashes originally signified an anchor within the document.

Because 1) using hashes and URL fragments should not be used for routing; 2) we don't want to create catch-all routes; 3) we don't need server-side controllers and views; 4) we still wish to use WebApi; and, 5) we need to be able to serve up static files, AngularMiddleware was created.

Approach

My first attempt at hooking into the request pipeline is shown in a question I posted on StackOverflow. The logic was very elementary to simply ignore any request whose path began with /api - allow MVC to serve those. All other requests would serve index.html in the root directory. I posted the question to see if anyone knew of anything built-in the MVC 5. I assumed that because Microsoft was pushing Angular and client-side development so much, they would have provided a mechanism of sorts. Unfortunately, not.

One of the responses I received pointed me to Angular's ui-router documentation on GitHub for removing the hash (e.g. html5mode). For ASP.NET/IIS, there were two possibilities...

  1. Azure IIS Rewrites
  2. ASP.Net C# Rewrites

In the case of ASP.NET 5 and DNX, neither are a good fit. The web.cofing, while it can be modified, should be only contain a couple of entries for the httpPlatformHandler in order to support the new hosting model. Similarly, Global.asax has been deprecated. For ASP.NET 5 web applications, almost all configurations have been moved into various json configuration files; and, application events should be managed in the request pipe configured by the Startup class.

Therefore, AngularMiddleware provides a solution to the issues listed above and offers additional configurations.

Installation

AngularMiddleware should be listed in your project's dependencies within the project.json configuration file. NuGet will download the libaries and include them in your project automatically.

{
..."dependencies":{"AngularMiddleware":"version"}
...}

Basic Usage

Startup.cs
Add a using reference for AngularMiddleware at the top of your StartUp class file. Then, add AngularMiddleware to the Configure() method.

publicvoidConfigure(IApplicationBuilderapp,IHostingEnvironmentenv){
...app.UseAngular();
...}

This is the basic configuration and, assuming that you have index.html in your wwwroot directory, all should work.

Advanced Options

Different Default Document
In the case you choose a different document as your default (e.g. instead of index.html), you can tell AngularMiddleware what that default document should be.

app.UseAngular(routes =>{routes.DefaultRoute="default.html";});

Route/Page Redirection
Let's say that you wish to redirect all requests for ~/administrators.html, ~/hr_users.html, and ~/marketing_users.html to ~/users.html.

app.UseAngular(routes =>{routes.MapAngularRoute(new[]{"administrators.html","hr_users.html","marketing_users.html"},"users.html");});

Ingore Specific Requests
AngularMiddleware also allows you to ignore specific requests.

app.UseAngular(routes =>{routes.IgnoreAngularRoute("admin.html");});

NOTE: IgnoreAngularRoute should only be used in rare cases that the pipeline doesn't service a request properly. If you are using MVC middleware and you've defined routes (e.g. legacy routing or attribute routing), those routes will be ignored by AngularMiddleware and be served, instead, by the MVC middleware. Likewise, if you are using either/both of the DefaultFiles and StaticFiles middleware, unless a specific route is mapped (i.e. rewritten) or ignored, these middleware will serve static files - including the default files (if DefaultFiles middleware is used).

License

AngularMiddleware is released under the MIT License.

Development

The AngularMiddleware project is developed and maintained by Joshua Davis.

About

Middleware for facilitating support of true Angular client-side applications in ASP.NET 5.

Resources

Stars

4 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length \u003e 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

42 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

AngularMiddleware

Build status

Middleware for facilitating support of true Angular client-side applications in ASP.NET 5.

AngularMiddleware allows the development of Angular (or any other JavaScript framework) client-side application ASP.NET 5 without the need for controllers and views.

Problem

Typically, with ASP.NET web applications, there are a few requirements for supporting Angular and other JavaScript frameworks.

  1. Unnecessary controllers and views that are serving static pages

  2. Creating "catch-all" routes:

    routes.MapRoute("","{url}",new{controller="Home",Action="Index"});

While this may work in cases where you prefer using partial views and perform additional ViewModel binding, this isn't the cleanest approach to accomplishing a true client-side application.

In reality, one would prefer to utilize the ASP.NET framework for it's WebApi and REST services while leaving all presentation, databinding and routing strictly on the client.

Push State

Initially, routing was performed by appending a "hash" or "hashbang" to the end of URLs. These URLs utilize the fragment portion of the URL as if it were an extension of the path name (e.g. #/user/1234). This was great for older browsers (and still should be used if you need to support older browsers), but is no longer necessary due to the arrival of the HTML5 History API. Continuing to use hashes should also be stopped due to the fact that hashes originally signified an anchor within the document.

Because 1) using hashes and URL fragments should not be used for routing; 2) we don't want to create catch-all routes; 3) we don't need server-side controllers and views; 4) we still wish to use WebApi; and, 5) we need to be able to serve up static files, AngularMiddleware was created.

Approach

My first attempt at hooking into the request pipeline is shown in a question I posted on StackOverflow. The logic was very elementary to simply ignore any request whose path began with /api - allow MVC to serve those. All other requests would serve index.html in the root directory. I posted the question to see if anyone knew of anything built-in the MVC 5. I assumed that because Microsoft was pushing Angular and client-side development so much, they would have provided a mechanism of sorts. Unfortunately, not.

One of the responses I received pointed me to Angular's ui-router documentation on GitHub for removing the hash (e.g. html5mode). For ASP.NET/IIS, there were two possibilities...

  1. Azure IIS Rewrites
  2. ASP.Net C# Rewrites

In the case of ASP.NET 5 and DNX, neither are a good fit. The web.cofing, while it can be modified, should be only contain a couple of entries for the httpPlatformHandler in order to support the new hosting model. Similarly, Global.asax has been deprecated. For ASP.NET 5 web applications, almost all configurations have been moved into various json configuration files; and, application events should be managed in the request pipe configured by the Startup class.

Therefore, AngularMiddleware provides a solution to the issues listed above and offers additional configurations.

Installation

AngularMiddleware should be listed in your project's dependencies within the project.json configuration file. NuGet will download the libaries and include them in your project automatically.

{
..."dependencies":{"AngularMiddleware":"version"}
...}

Basic Usage

Startup.cs
Add a using reference for AngularMiddleware at the top of your StartUp class file. Then, add AngularMiddleware to the Configure() method.

publicvoidConfigure(IApplicationBuilderapp,IHostingEnvironmentenv){
...app.UseAngular();
...}

This is the basic configuration and, assuming that you have index.html in your wwwroot directory, all should work.

Advanced Options

Different Default Document
In the case you choose a different document as your default (e.g. instead of index.html), you can tell AngularMiddleware what that default document should be.

app.UseAngular(routes =>{routes.DefaultRoute="default.html";});

Route/Page Redirection
Let's say that you wish to redirect all requests for ~/administrators.html, ~/hr_users.html, and ~/marketing_users.html to ~/users.html.

app.UseAngular(routes =>{routes.MapAngularRoute(new[]{"administrators.html","hr_users.html","marketing_users.html"},"users.html");});

Ingore Specific Requests
AngularMiddleware also allows you to ignore specific requests.

app.UseAngular(routes =>{routes.IgnoreAngularRoute("admin.html");});

NOTE: IgnoreAngularRoute should only be used in rare cases that the pipeline doesn't service a request properly. If you are using MVC middleware and you've defined routes (e.g. legacy routing or attribute routing), those routes will be ignored by AngularMiddleware and be served, instead, by the MVC middleware. Likewise, if you are using either/both of the DefaultFiles and StaticFiles middleware, unless a specific route is mapped (i.e. rewritten) or ignored, these middleware will serve static files - including the default files (if DefaultFiles middleware is used).

License

AngularMiddleware is released under the MIT License.

Development

The AngularMiddleware project is developed and maintained by Joshua Davis.

About

Middleware for facilitating support of true Angular client-side applications in ASP.NET 5.

Resources

Stars

4 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

42 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

AngularMiddleware

Build status

Middleware for facilitating support of true Angular client-side applications in ASP.NET 5.

AngularMiddleware allows the development of Angular (or any other JavaScript framework) client-side application ASP.NET 5 without the need for controllers and views.

Problem

Typically, with ASP.NET web applications, there are a few requirements for supporting Angular and other JavaScript frameworks.

  1. Unnecessary controllers and views that are serving static pages

  2. Creating "catch-all" routes:

    routes.MapRoute("","{url}",new{controller="Home",Action="Index"});

While this may work in cases where you prefer using partial views and perform additional ViewModel binding, this isn't the cleanest approach to accomplishing a true client-side application.

In reality, one would prefer to utilize the ASP.NET framework for it's WebApi and REST services while leaving all presentation, databinding and routing strictly on the client.

Push State

Initially, routing was performed by appending a "hash" or "hashbang" to the end of URLs. These URLs utilize the fragment portion of the URL as if it were an extension of the path name (e.g. #/user/1234). This was great for older browsers (and still should be used if you need to support older browsers), but is no longer necessary due to the arrival of the HTML5 History API. Continuing to use hashes should also be stopped due to the fact that hashes originally signified an anchor within the document.

Because 1) using hashes and URL fragments should not be used for routing; 2) we don't want to create catch-all routes; 3) we don't need server-side controllers and views; 4) we still wish to use WebApi; and, 5) we need to be able to serve up static files, AngularMiddleware was created.

Approach

My first attempt at hooking into the request pipeline is shown in a question I posted on StackOverflow. The logic was very elementary to simply ignore any request whose path began with /api - allow MVC to serve those. All other requests would serve index.html in the root directory. I posted the question to see if anyone knew of anything built-in the MVC 5. I assumed that because Microsoft was pushing Angular and client-side development so much, they would have provided a mechanism of sorts. Unfortunately, not.

One of the responses I received pointed me to Angular's ui-router documentation on GitHub for removing the hash (e.g. html5mode). For ASP.NET/IIS, there were two possibilities...

  1. Azure IIS Rewrites
  2. ASP.Net C# Rewrites

In the case of ASP.NET 5 and DNX, neither are a good fit. The web.cofing, while it can be modified, should be only contain a couple of entries for the httpPlatformHandler in order to support the new hosting model. Similarly, Global.asax has been deprecated. For ASP.NET 5 web applications, almost all configurations have been moved into various json configuration files; and, application events should be managed in the request pipe configured by the Startup class.

Therefore, AngularMiddleware provides a solution to the issues listed above and offers additional configurations.

Installation

AngularMiddleware should be listed in your project's dependencies within the project.json configuration file. NuGet will download the libaries and include them in your project automatically.

{
..."dependencies":{"AngularMiddleware":"version"}
...}

Basic Usage

Startup.cs
Add a using reference for AngularMiddleware at the top of your StartUp class file. Then, add AngularMiddleware to the Configure() method.

publicvoidConfigure(IApplicationBuilderapp,IHostingEnvironmentenv){
...app.UseAngular();
...}

This is the basic configuration and, assuming that you have index.html in your wwwroot directory, all should work.

Advanced Options

Different Default Document
In the case you choose a different document as your default (e.g. instead of index.html), you can tell AngularMiddleware what that default document should be.

app.UseAngular(routes =>{routes.DefaultRoute="default.html";});

Route/Page Redirection
Let's say that you wish to redirect all requests for ~/administrators.html, ~/hr_users.html, and ~/marketing_users.html to ~/users.html.

app.UseAngular(routes =>{routes.MapAngularRoute(new[]{"administrators.html","hr_users.html","marketing_users.html"},"users.html");});

Ingore Specific Requests
AngularMiddleware also allows you to ignore specific requests.

app.UseAngular(routes =>{routes.IgnoreAngularRoute("admin.html");});

NOTE: IgnoreAngularRoute should only be used in rare cases that the pipeline doesn't service a request properly. If you are using MVC middleware and you've defined routes (e.g. legacy routing or attribute routing), those routes will be ignored by AngularMiddleware and be served, instead, by the MVC middleware. Likewise, if you are using either/both of the DefaultFiles and StaticFiles middleware, unless a specific route is mapped (i.e. rewritten) or ignored, these middleware will serve static files - including the default files (if DefaultFiles middleware is used).

License

AngularMiddleware is released under the MIT License.

Development

The AngularMiddleware project is developed and maintained by Joshua Davis.

About

Middleware for facilitating support of true Angular client-side applications in ASP.NET 5.

Resources

Stars

4 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

42 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

AngularMiddleware

Build status

Middleware for facilitating support of true Angular client-side applications in ASP.NET 5.

AngularMiddleware allows the development of Angular (or any other JavaScript framework) client-side application ASP.NET 5 without the need for controllers and views.

Problem

Typically, with ASP.NET web applications, there are a few requirements for supporting Angular and other JavaScript frameworks.

  1. Unnecessary controllers and views that are serving static pages

  2. Creating "catch-all" routes:

    routes.MapRoute("","{url}",new{controller="Home",Action="Index"});

While this may work in cases where you prefer using partial views and perform additional ViewModel binding, this isn't the cleanest approach to accomplishing a true client-side application.

In reality, one would prefer to utilize the ASP.NET framework for it's WebApi and REST services while leaving all presentation, databinding and routing strictly on the client.

Push State

Initially, routing was performed by appending a "hash" or "hashbang" to the end of URLs. These URLs utilize the fragment portion of the URL as if it were an extension of the path name (e.g. #/user/1234). This was great for older browsers (and still should be used if you need to support older browsers), but is no longer necessary due to the arrival of the HTML5 History API. Continuing to use hashes should also be stopped due to the fact that hashes originally signified an anchor within the document.

Because 1) using hashes and URL fragments should not be used for routing; 2) we don't want to create catch-all routes; 3) we don't need server-side controllers and views; 4) we still wish to use WebApi; and, 5) we need to be able to serve up static files, AngularMiddleware was created.

Approach

My first attempt at hooking into the request pipeline is shown in a question I posted on StackOverflow. The logic was very elementary to simply ignore any request whose path began with /api - allow MVC to serve those. All other requests would serve index.html in the root directory. I posted the question to see if anyone knew of anything built-in the MVC 5. I assumed that because Microsoft was pushing Angular and client-side development so much, they would have provided a mechanism of sorts. Unfortunately, not.

One of the responses I received pointed me to Angular's ui-router documentation on GitHub for removing the hash (e.g. html5mode). For ASP.NET/IIS, there were two possibilities...

  1. Azure IIS Rewrites
  2. ASP.Net C# Rewrites

In the case of ASP.NET 5 and DNX, neither are a good fit. The web.cofing, while it can be modified, should be only contain a couple of entries for the httpPlatformHandler in order to support the new hosting model. Similarly, Global.asax has been deprecated. For ASP.NET 5 web applications, almost all configurations have been moved into various json configuration files; and, application events should be managed in the request pipe configured by the Startup class.

Therefore, AngularMiddleware provides a solution to the issues listed above and offers additional configurations.

Installation

AngularMiddleware should be listed in your project's dependencies within the project.json configuration file. NuGet will download the libaries and include them in your project automatically.

{
..."dependencies":{"AngularMiddleware":"version"}
...}

Basic Usage

Startup.cs
Add a using reference for AngularMiddleware at the top of your StartUp class file. Then, add AngularMiddleware to the Configure() method.

publicvoidConfigure(IApplicationBuilderapp,IHostingEnvironmentenv){
...app.UseAngular();
...}

This is the basic configuration and, assuming that you have index.html in your wwwroot directory, all should work.

Advanced Options

Different Default Document
In the case you choose a different document as your default (e.g. instead of index.html), you can tell AngularMiddleware what that default document should be.

app.UseAngular(routes =>{routes.DefaultRoute="default.html";});

Route/Page Redirection
Let's say that you wish to redirect all requests for ~/administrators.html, ~/hr_users.html, and ~/marketing_users.html to ~/users.html.

app.UseAngular(routes =>{routes.MapAngularRoute(new[]{"administrators.html","hr_users.html","marketing_users.html"},"users.html");});

Ingore Specific Requests
AngularMiddleware also allows you to ignore specific requests.

app.UseAngular(routes =>{routes.IgnoreAngularRoute("admin.html");});

NOTE: IgnoreAngularRoute should only be used in rare cases that the pipeline doesn't service a request properly. If you are using MVC middleware and you've defined routes (e.g. legacy routing or attribute routing), those routes will be ignored by AngularMiddleware and be served, instead, by the MVC middleware. Likewise, if you are using either/both of the DefaultFiles and StaticFiles middleware, unless a specific route is mapped (i.e. rewritten) or ignored, these middleware will serve static files - including the default files (if DefaultFiles middleware is used).

License

AngularMiddleware is released under the MIT License.

Development

The AngularMiddleware project is developed and maintained by Joshua Davis.

About

Middleware for facilitating support of true Angular client-side applications in ASP.NET 5.

Resources

Stars

4 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

42 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

AngularMiddleware

Build status

Middleware for facilitating support of true Angular client-side applications in ASP.NET 5.

AngularMiddleware allows the development of Angular (or any other JavaScript framework) client-side application ASP.NET 5 without the need for controllers and views.

Problem

Typically, with ASP.NET web applications, there are a few requirements for supporting Angular and other JavaScript frameworks.

  1. Unnecessary controllers and views that are serving static pages

  2. Creating "catch-all" routes:

    routes.MapRoute("","{url}",new{controller="Home",Action="Index"});

While this may work in cases where you prefer using partial views and perform additional ViewModel binding, this isn't the cleanest approach to accomplishing a true client-side application.

In reality, one would prefer to utilize the ASP.NET framework for it's WebApi and REST services while leaving all presentation, databinding and routing strictly on the client.

Push State

Initially, routing was performed by appending a "hash" or "hashbang" to the end of URLs. These URLs utilize the fragment portion of the URL as if it were an extension of the path name (e.g. #/user/1234). This was great for older browsers (and still should be used if you need to support older browsers), but is no longer necessary due to the arrival of the HTML5 History API. Continuing to use hashes should also be stopped due to the fact that hashes originally signified an anchor within the document.

Because 1) using hashes and URL fragments should not be used for routing; 2) we don't want to create catch-all routes; 3) we don't need server-side controllers and views; 4) we still wish to use WebApi; and, 5) we need to be able to serve up static files, AngularMiddleware was created.

Approach

My first attempt at hooking into the request pipeline is shown in a question I posted on StackOverflow. The logic was very elementary to simply ignore any request whose path began with /api - allow MVC to serve those. All other requests would serve index.html in the root directory. I posted the question to see if anyone knew of anything built-in the MVC 5. I assumed that because Microsoft was pushing Angular and client-side development so much, they would have provided a mechanism of sorts. Unfortunately, not.

One of the responses I received pointed me to Angular's ui-router documentation on GitHub for removing the hash (e.g. html5mode). For ASP.NET/IIS, there were two possibilities...

  1. Azure IIS Rewrites
  2. ASP.Net C# Rewrites

In the case of ASP.NET 5 and DNX, neither are a good fit. The web.cofing, while it can be modified, should be only contain a couple of entries for the httpPlatformHandler in order to support the new hosting model. Similarly, Global.asax has been deprecated. For ASP.NET 5 web applications, almost all configurations have been moved into various json configuration files; and, application events should be managed in the request pipe configured by the Startup class.

Therefore, AngularMiddleware provides a solution to the issues listed above and offers additional configurations.

Installation

AngularMiddleware should be listed in your project's dependencies within the project.json configuration file. NuGet will download the libaries and include them in your project automatically.

{
..."dependencies":{"AngularMiddleware":"version"}
...}

Basic Usage

Startup.cs
Add a using reference for AngularMiddleware at the top of your StartUp class file. Then, add AngularMiddleware to the Configure() method.

publicvoidConfigure(IApplicationBuilderapp,IHostingEnvironmentenv){
...app.UseAngular();
...}

This is the basic configuration and, assuming that you have index.html in your wwwroot directory, all should work.

Advanced Options

Different Default Document
In the case you choose a different document as your default (e.g. instead of index.html), you can tell AngularMiddleware what that default document should be.

app.UseAngular(routes =>{routes.DefaultRoute="default.html";});

Route/Page Redirection
Let's say that you wish to redirect all requests for ~/administrators.html, ~/hr_users.html, and ~/marketing_users.html to ~/users.html.

app.UseAngular(routes =>{routes.MapAngularRoute(new[]{"administrators.html","hr_users.html","marketing_users.html"},"users.html");});

Ingore Specific Requests
AngularMiddleware also allows you to ignore specific requests.

app.UseAngular(routes =>{routes.IgnoreAngularRoute("admin.html");});

NOTE: IgnoreAngularRoute should only be used in rare cases that the pipeline doesn't service a request properly. If you are using MVC middleware and you've defined routes (e.g. legacy routing or attribute routing), those routes will be ignored by AngularMiddleware and be served, instead, by the MVC middleware. Likewise, if you are using either/both of the DefaultFiles and StaticFiles middleware, unless a specific route is mapped (i.e. rewritten) or ignored, these middleware will serve static files - including the default files (if DefaultFiles middleware is used).

License

AngularMiddleware is released under the MIT License.

Development

The AngularMiddleware project is developed and maintained by Joshua Davis.

About

Middleware for facilitating support of true Angular client-side applications in ASP.NET 5.

Resources

Stars

4 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

42 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

AngularMiddleware

Build status

Middleware for facilitating support of true Angular client-side applications in ASP.NET 5.

AngularMiddleware allows the development of Angular (or any other JavaScript framework) client-side application ASP.NET 5 without the need for controllers and views.

Problem

Typically, with ASP.NET web applications, there are a few requirements for supporting Angular and other JavaScript frameworks.

  1. Unnecessary controllers and views that are serving static pages

  2. Creating "catch-all" routes:

    routes.MapRoute("","{url}",new{controller="Home",Action="Index"});

While this may work in cases where you prefer using partial views and perform additional ViewModel binding, this isn't the cleanest approach to accomplishing a true client-side application.

In reality, one would prefer to utilize the ASP.NET framework for it's WebApi and REST services while leaving all presentation, databinding and routing strictly on the client.

Push State

Initially, routing was performed by appending a "hash" or "hashbang" to the end of URLs. These URLs utilize the fragment portion of the URL as if it were an extension of the path name (e.g. #/user/1234). This was great for older browsers (and still should be used if you need to support older browsers), but is no longer necessary due to the arrival of the HTML5 History API. Continuing to use hashes should also be stopped due to the fact that hashes originally signified an anchor within the document.

Because 1) using hashes and URL fragments should not be used for routing; 2) we don't want to create catch-all routes; 3) we don't need server-side controllers and views; 4) we still wish to use WebApi; and, 5) we need to be able to serve up static files, AngularMiddleware was created.

Approach

My first attempt at hooking into the request pipeline is shown in a question I posted on StackOverflow. The logic was very elementary to simply ignore any request whose path began with /api - allow MVC to serve those. All other requests would serve index.html in the root directory. I posted the question to see if anyone knew of anything built-in the MVC 5. I assumed that because Microsoft was pushing Angular and client-side development so much, they would have provided a mechanism of sorts. Unfortunately, not.

One of the responses I received pointed me to Angular's ui-router documentation on GitHub for removing the hash (e.g. html5mode). For ASP.NET/IIS, there were two possibilities...

  1. Azure IIS Rewrites
  2. ASP.Net C# Rewrites

In the case of ASP.NET 5 and DNX, neither are a good fit. The web.cofing, while it can be modified, should be only contain a couple of entries for the httpPlatformHandler in order to support the new hosting model. Similarly, Global.asax has been deprecated. For ASP.NET 5 web applications, almost all configurations have been moved into various json configuration files; and, application events should be managed in the request pipe configured by the Startup class.

Therefore, AngularMiddleware provides a solution to the issues listed above and offers additional configurations.

Installation

AngularMiddleware should be listed in your project's dependencies within the project.json configuration file. NuGet will download the libaries and include them in your project automatically.

{
..."dependencies":{"AngularMiddleware":"version"}
...}

Basic Usage

Startup.cs
Add a using reference for AngularMiddleware at the top of your StartUp class file. Then, add AngularMiddleware to the Configure() method.

publicvoidConfigure(IApplicationBuilderapp,IHostingEnvironmentenv){
...app.UseAngular();
...}

This is the basic configuration and, assuming that you have index.html in your wwwroot directory, all should work.

Advanced Options

Different Default Document
In the case you choose a different document as your default (e.g. instead of index.html), you can tell AngularMiddleware what that default document should be.

app.UseAngular(routes =>{routes.DefaultRoute="default.html";});

Route/Page Redirection
Let's say that you wish to redirect all requests for ~/administrators.html, ~/hr_users.html, and ~/marketing_users.html to ~/users.html.

app.UseAngular(routes =>{routes.MapAngularRoute(new[]{"administrators.html","hr_users.html","marketing_users.html"},"users.html");});

Ingore Specific Requests
AngularMiddleware also allows you to ignore specific requests.

app.UseAngular(routes =>{routes.IgnoreAngularRoute("admin.html");});

NOTE: IgnoreAngularRoute should only be used in rare cases that the pipeline doesn't service a request properly. If you are using MVC middleware and you've defined routes (e.g. legacy routing or attribute routing), those routes will be ignored by AngularMiddleware and be served, instead, by the MVC middleware. Likewise, if you are using either/both of the DefaultFiles and StaticFiles middleware, unless a specific route is mapped (i.e. rewritten) or ignored, these middleware will serve static files - including the default files (if DefaultFiles middleware is used).

License

AngularMiddleware is released under the MIT License.

Development

The AngularMiddleware project is developed and maintained by Joshua Davis.

About

Middleware for facilitating support of true Angular client-side applications in ASP.NET 5.

Resources

Stars

4 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages