I have a ASP.NET MVC web application that is very dynamic in it's nature:
A controller loads data from some service. Based on this response, it calls others sub-controller's actions which in turn may or may not render certain views. The response of the service is dependent upon a lot of factors and may change a lot of the page's output.
Now we're in a situation that only if a certain sub-view is rendered, we need to include a javascript bundle:
If a certain sub-controller renders a certain sub-view, we must include the script reference.
We must not include this bundle in the page when this certain sub-view ist not rendered.
The availability of the sub-view is determined dynamically from some other sub-controllers remote call.
The script absolutely needs to be included in the page header, since it executes certain code that will cause problems if done later (setting document.domain and stuff).
How can we achieve that in a clean and MVCy-way?
Related
My Asp.Net Core 2.1 app can generate two HTML reports. Each report has a button for outputting the report as a PDF file using DinkToPDF. The button calls a controller for that report that provides all the parameters that DinkToPDF needs and then generates the PDF. An essential parameter is the URL of the page to be converted, which is not the original HTML report but a lookalike from which javascript etc. has been removed.
The first report would output the login page instead of the report data until I put [AllowAnonymous] above the class name. Then it worked fine.
The second report used the files from the first report as a template. In all necessary places everything was renamed appropriately. But even though this page of course has [AllowAnonymous], it will only generate a PDF of the login page.
I can step through the controller code and watch the DinkToPDF params get their values. But when "convert" method of DinkToPDF is called, something goes wrong.
Is there a way to watch inside that method to see why it thinks it must authenticate?
After I thought to look in the Output window, I saw that this was one of those "Qt: Could not initialize OLE" errors. I also found that the database context object being injected into my class was null. Evidently the context was being lost somehow. In the original report, that didn't matter because I had sidestepped EF Core and was accessing the database by old-style ADO-type calls.
Therefore, in the new report, I replaced all EF Core with ADO-type calls, and the problem went away. Just had to work out some routing.
I'm trying to figure out a way to customize a Route that will allow me to use a subfolder within a particular View folder.
I have a Controller (FinanceAdmin) and a View folder (\FinanceAdmin) which contains a number of Views. Within that view folder, I have a lot of stand alone chart Views (Chart1, Chart2...Chart50, etc...) which I include as Partials on various View pages. To clean things up in my file/organizational structure, I would like to set things up like this:
I know I can use Areas to separate different parts of my application but that's not really what I'm looking for. I want to be able to create a custom Route so that, in my controller, I can simply return:
return View(chartdata);
instead of
return View("~/Views/FinanceAdmin/Chart/_Chart1.cshtml",chartdata);
Is that possible with a generic route (so I don't have to create one for each file)? I'd rather not write a custom view engine just for this unique circumstance.
I am afraid that this is not possible with a route. The routing engine finishes his responsibility at the time he finds (or doesn't find) a controller action to be executed given some request url.
Resolving views is purely the responsibility of the view engine. So if the conventions built into the view engine you are using do not meet your specific requirements, customizing this view engine is the right way to go.
I have a question to creator of WinRT XAML Toolkit that had helped me a lot.
What is the best mechanism for working with rich pages in WinRT?
These are the conditions:
There are about 2 pages that have a lot of elements and some high resolution images in the background. Obviously they consume time to load their content. That's why I use AlternativeFrame.Preload() method from the Toolkit.
Also these pages are the most frequently used.
That's why I stand before choosing to either constantly preload these pages (create, draw, fill) but when it is needed or creating my own page cache that would store them (maybe I am blind and the Toolkit already has this functionality?).
Can you advise what's the best practice in this problem and whether maybe there's a third way?
To add some more background - the WinRT XAML Toolkit library has two controls: AlternativeFrame and AlternativePage that are alternate implementations of the base Frame and Page classes that come out of the box in Windows 8 SDK for dealing with UI navigation - similar to how you navigate pages in a web browser. The API of these alternative controls is almost the same as in the base ones, but it adds some more support for asynchronous development model, page transition animations and preloading pages before they are requested.
Currently the Preload() method preloads a page of a given type in the background and puts it in a cache and when a Navigate() method is invoked to navigate to the page of that type - instead of instantiating a new page - the one in the cache is used, so it can immediately be shown, but also - the cache gets emptied and the next time you want to navigate to that same page - you need to preload it again. This works well if you don't return to the preloaded page often and the page uses a lot of memory, but if you want to keep that page in cache - there is not built-in support for that. The original Page class has a NavigationCacheMode property that allows to configure a page to be kept in cache once it is loaded the first time and it would be a good option for you, but AlternativePage doesn't have that support yet. I am thinking about adding it there today since I have some free time, so you might decide to wait for me to do it. Other options include
displaying your page on top of the navigation frame instead of navigating to it in the frame - then you could simply show/hide it when needed
or you can switch back to the standard Frame/Page controls and set NavigationCacheMode="Required" on your Page so it stays in memory forever, though you do lose the Preload() feature then.
or you can modify the Toolkit yourself
or you can cache the content of your page yourself - simply save the Content of your page in some sort of cache (e.g. a Dictionary<Type,UIElement> that maps page type to content) and remove it from the page (set Content to null) when you navigate away from the page and then add it back to the page when you navigate to it and the content is found in the cache. In that case you would probably want to make the Content be a separate UserControl and skip calling InitializeComponent() in the constructor if you retrieve the content from the cache since you can only have one Content and having it defined in a separate UserControl will allow you to get auto-generated code that gets executed in InitializeComponent() that grants you easy access to named elements, registers event handlers etc.
I am new to Jquery mobile and asp.net mvc4. In my application I have divided my page into three blocks(ui-block-a,ui-block-b,ui-block-c).These three blocks are in shared folder(_Layout.cshtml). Left side and right side blocks are partially viewed. In the middle block is normally viewed. When I perform any modification the partial view is also refershing.I want to load my partial view on my first time loading only. If I do any change on middle block the partial views should not be affected. please help how can
I do this?
Partial view doesn't mean it would be partially updated. It's just a small chunk of ui code wich is suitable to be grouped into a separated file for reuse.
you'll need to implement ajax functions into middle block when updating.
jQuery.ajax
would be the api you can refer to.
I have a huge website (containing around 5000+) pages. There is a theme functionality in the website where user can choose different colors for their profile. Now i want to use the ASP.net theme feature and put different CSS (for different colors) in the theme folder and in Global.asax i want check the user theme and render appropriate link element with the css. But my problem is, i am not able to access the Page element for adding the link in the page.
Here is my code
Dim page As System.Web.UI.Page = TryCast(System.Web.HttpContext.Current.Handler,System.Web.UI.Page)
page.StyleSheetTheme = "Black"
But when i run this code I get a Null reference error.
P.s : My application is very huge so its not possible to have a master page or a base class and inherit it in every page.
Please suggest.
The page is not available in PreRequestExecute. This function is called before asp.net steps in to handle things, and asp.net is responsible for the page. Think of PreRequestExecute as being earlier in the scheme of things, like when IIS is first trying to figure out what to do with this thing it has, the thing is not even a page yet.
You might want to look into some of the other events that you can hook, there are events that would take place after the page has loaded that may allow you to do what you are suggesting.
Rather than going into global.asax for this, consider using master pages. One possibility is to have nested master pages, where the first master page sets up overall layout, and the nested master handles the theme. (Or one of several nested master pages, all referencing the same top-level master page). If necessary, you can use the PreInit event in the page to change master pages, and select the master that matches your theme selection.
You can centralize this function by having your own class that inherits System.Web.UI.Page, and have all your own pages inherit this new class. Handle the PreInit event there. (As well as other useful functions, like page-level handling of unhandled exceptions, general security issues, etc.
EDITED TO ADD: As #aepheus correctly notes, the page hasn't been instantiated at the PreRequestHandlerExecute event. So there's no page class you can access.