Render external html page with dependancies (resources) - asp.net-mvc

I have an ASP.NET MVC3 application. In my application, I need to be able to render external HTML pages. These HTML pages are stored in a simple file structure, with images, CSS and JS files stored in folders. Basically opening the HTML file will render the page as it should be rendered. What I want is to be able to render this page programatically.
So far, I have tried stuff like this:
Response.WriteFile(path)
return new FilePathResult("~/Path", "text/html");
The problem is that the resources (images, CSS and JS files) do not get loaded, since I only load the html source.
What can I do to be able to correctly render the html file with the other included files?
P.S.: I know that this functionality can be a security hole in my application. Thanks!
Edit: As Darin pointed out, I can use an iframe to place the rendered HTML page in my view. This is what I am currently using, but I want to implement a more secure solution, a solution that wouldn't allow access to the actual HTML page.

What can I do to be able to correctly render the html file with the other included files?
You could use an iframe:
<iframe src="/somepage.html"></iframe>
The return new FilePathResult("~/Path", "text/html"); should also work, it's just that the static resources referenced in this HTML page (CSS, javascript, images, ...) need to be relative to the current url or absolute urls (which is more difficult if they are static HTML).

Related

Feed Electron's webview with HTML contained in a string

I want to embed an "HTML viewer" inside of my Electron app, which would be fed with HTML contained in a string. My application automatically generates HTML code, which I want to visualize rendered as it would be displayed in a web browser.
I have seen there is a component called <webview> but it loads the HTML content from an external site via URI.
Is it possible to feed this <webview> component (or any other) with HTML from a simple string to achieve my goal?
Check this in electron repository
https://github.com/electron/electron/issues/1146
You can go with data uri, if you don't need JavaScript.
If you need JavaScript, there is a workaround. You can save the html string as a html file and load the html file in electron
Once the window is closed, you can delete the html file

MVC .NET Core 2.0 - _Layout static files do not load for action methods of a controller

I started a new project in VS 2017 and created a ASP.NET Core 2.0 web application (Model View Controller). Then I've changed the conent of the _Layout.cshtml to the interface I want to use (included #Renderbody etc.) and included all the static content it requires in the wwwroot and save and Ctrl+F5 and the layout shows with all the correct formatting and functionality. No problem so far:
However from this point forward none of the static content files of the _Layout shows in any other view. So for example if I visit any of the following URLS:
http://localhost:52786/home/
http://localhost:52786/home/index
http://localhost:52786/home/about
http://localhost:52786/home/contact
I see this:
Startup.cs already has app.UseStaticFiles() in Configure()
So it sounds like you may have your HTML body content in the wrong place. With ASP.NET MVC &ASP.NET Core MVC, the HTML for each page is served up from the /Views directory (by the Home controller by default), not from the /wwwroot, and it is C# HTML (.cshtml) just like the _Layout.cshtml file. Things like images, static javascript etc. are what's typically located in the /wwwroot directory as these are the parts of your website that are client side instead of server-side.
Try replicating your index, about and contact HTML content as .cshtml files under the /Views/Home directory, replacing whatever's there in the template, except for #{ViewData["Title"] = "Home";} located at the top. The layout template should then serve these as the body content (where #renderbody... is in _Layout.cshtml).
If this still doesn't work I'll need a bit more info about what you've changed from the default template. Hope this helps!
Thank you James for your response. I figured it out and it's actually a noob mistake which I'm posting so that other new developers don't get caught in it.
When you want to reference the content in the wwwroot folder if you reference them without "~/" before the name of the directory it works for the _Layout page which fooled me to think it should work for other parts of the application but you should include "~/" before the folder names explicitly otherwise the static files will be un reachable.

Password protect with Identity an independent HTML project

So we've got a project that our tutorial software exports as an HTML project. (Root has an index.html file, folders for js, css, etc)
Our support portal with Identity account management runs on ASP.NET MVC.
What I'd like is for the HTML project to be accessible, but you must login first.
I've gone about it two ways, unsuccessful both times:
I can put the HTML project in a static folder in the root of the ASP project. This way I can access it as domain.com/Test/Course/index.html. Everything works fine here, js and css are loaded properly, but it is not password protected.
I can put it in the App_Data folder, create a route to an action with the [Authorize] parameter that returns a FileResult, grabbing from the App_Data folder. This locks, and on login loads the index.html file, but all of the html files resources (accompanying js and css files) fail to load because the paths are wrong. It's pulling from App_Data, but index.html is now somewhere else, away from it's included js and css folders.
Any ideas would be greatly appreciated.
You'll want to take a look at these two questions:
How to do Forms Authentication on purely HTML pages using ASP.NET?
https://serverfault.com/questions/509879/protecting-static-content-with-forms-authentication-under-iis8
Basically - ASP.NET doesn't by default handle .html content because it's much faster to have IIS handle it directly. You need to configure it correctly to have it apply to .html files so that it can then apply its authentication model.

Ordinary html links in mvc razor

I have an mvc razor app that's humming along nicely, and I just tried to drop in a static html Terms and Conditions page. When I try to link to it from my opt-in cshtml with
Terms and Conditions
It 404s at runtime with "resource cannot be found".
It's in the compiled folder. The path and name are correct (I picked it with intellisense, so it knows it's there). The link cshtml page and destination html page are even in the same folder (I've tried using just the filename too).
It's just plain html. It shouldn't need any fiddling with routing or anything. Why can't it find it?
~/Views is inaccessible by default and ~ doesn't work in static HTML, you can use this and it should get you the relative path and work
Put your static HTML file in ~/Content/UserPromotion
and use
Terms and Conditions

How to access HTML files from ASP.NET MVC VIEWS Folder

I will like add conventional HTML page under VIEWS folder (in ASp.NET MVC) page.
I have added the route exceptions as mentioned below.
routes.IgnoreRoute("{resource}.htm/{*pathInfo}")
routes.IgnoreRoute("{resource}.html/{*pathInfo}")
Although it does work when I put the html files out of VIEWS folder but I get Page not found 404 when I put those in VIEWS folder. I am also unable to browse the VIEWS folder by setting directory browsing option in IIS.
Please help me on HOW to access HTML file from VIEWS folder.
I think that it's a mistake to mix your HTML content with your views. I'd suggest that you create a separate static folder under Content and put your HTML there. You can create an analogous directory structure to your view structure if necessary for management. Then you don't need to do anything special in order to able to reference the files. You can even, then, open them up to editing with Contribute, etc. by people who are allowed to modify static content.
+-Content
+-Images
+-Static
+-Account
+-privacy.html
+-refunds.html
+-Styles
Usage:
<a href='<%= Url.Content( "~/Content/Static/Account/privacy.html" ) %>'>Privacy Policy</a>
The default Views folder has an Web.config file that explicitly gives 404 errors for all requests. You just need to edit and enable for HTML files (or all files, but then people might snoop).

Resources