Initiate JavaScript Callback With MVC2 Using RenderAction
Mar 26, 2010
I am building a dashboard where I am iterating through a list of controls to render, and I need to initiate a general callback both after each control and after they are all completed. I was curious what the best way to handle this is. I can get the control specific callback fired off by placing myUserControlCallback(); in the user control itself. I'm just not sure how to run something like allControlsRendered().
I started with a view which repeatedly calls RenderAction(...) to include some external content implemented by another controller in my application. This is from the containing view:
[Code]....
The subModel objects are instances of the model for the MyController.MyAction view which has some Data Annotations validation attributes upon it. MyController.MyAction checks the model state is valid before it renders its view and chooses a view appropriately. This works fine.
However, if I use the MVC Futures' strongly typed helper to call RenderAction like so:
[Code]....
...then the validation is not performed. Or at least, the model state does not indicate that the model is invalid.
I'm using AJAX Page Methods, but I can't seem to be able to pass the needed parameters:
function getFavStatus() { //favs is a list of DOM <imgs> that I want to modify their img.src attribute for (i = 0; i < favs.length; i++) { PageMethods.isFavorite(favs[i].alt,setFavImg(favs[i])); } } function setFavImg(fav, response) { fav.src = response; } The problem that I can't figure out is how to use the "response" from PageMethods, AND pass the DOM object to the callback function. I've also tried doing something like this: function getFavStatus() { for (i = 0; i < favs.length; i++) { PageMethods.isFavorite(favs[i].alt, function (response) { favs[i].src = response;}); ); } }
In this case, the response works properly, but i is always > favs.length, because it has already iterated through the loop... Edit: My PageMethods.isFavorite signature is: [System.Web.Services.WebMethod] public static string isFavorite ( string p_id )
I have a updatepanel which contains of a few dynamically created ImageButtons (the ImageButtons are placed in a panel inside the updatepanel) Since the imagebuttons are children of the updatepanel they automatically triggers a callback to server, fine. But I want the user to be able to cancel the callback after clicking on the imgbutton, preferably through a javascript window.confirm.
I have managed to make it work with a jquery function returning false (i dont know why it works, dont really understand asp.net ajax functionality) but it only works until a callback is done, then I guess I have to rebind the jquery to the controls in the updatepanel or?this turned out to be a jquery question. How do I rebind the recently loaded controls in my updatepanel to my jqyery function? the controls all have the same class and I use that to trigger the jquery function.
I wanna assign a JavaScript CallBack function to an UpdatePanel which will be gets called when the UpdatePanel finishes its tasks. After, the UpdatePanel will be sending a string as a result. This JavaScript CallBack function will have to process this resulting string.
I'm doing a menu that loads levels dynamicly, when you click on a item the next level is loaded asynchronously. For each menu item I have a user control. Every user control is declared in its parent, for example, the "secondlevelcontrol" has the reference to "thirdlevelcontrol".With this level of nesting, I want to manage the asynchronous calls on every user control so, when the first level is loaded the javascript to load the second is loaded too. When the second level is loaded the javascript to load the third is loaded too.
To do asynchronous calls I'm implementing ICallbackEventHandler interface. As you can see in the examples, controls are added to the page as plain html. The method "ProcessOnLoadEvent" executes all lines of the "OnLoad" event of the user control.An example of the implementation is this for the user control of fourth level:
public string GetCallbackResult() { return _callbackRendering; }
and I on occasion want to add items to it using javascript/jquery.
When I select the items that have been added and it does a postback I get the following error:
Invalid postback or callback argument. Event validation is enabled using in configuration or <%@ Page EnableEventValidation="true" %> in a page. For security purposes, this feature verifies that arguments to postback or callback events originate from the server control that originally rendered them. If the data is valid and expected, use the ClientScriptManager.RegisterForEventValidation method in order to register the postback or callback data for validation.
Let's say you have a Javascript function that calls a web service method. So that webservice completes and calls a callback function, which has the result.
How do I get that result back into the original function that called the web service method? Essentially, I'm trying to "synchronize" an asynchronous call.
Update:
This is what I'm trying to do. I'm validating based on the return value of a web service.
I want to initiate a class for each user at the start of the user's session so that a single class can be used throughout the user's session. I checked out this post but I'm not sure where I should be placing this Sessionhandler class. Inside global.asax? How do I go about accomplishing this?
I'm building dynamically a series of ImageButton controls, and I want to assign them a hyperlink for downloading files.So say you got a dropdownlist of 3 items 1,2 and 3, if you select 1 it creates one imagebutton and pointrs to fileA, if you select 2 it creates two imagebuttons and the first one points to fileA and the second one to fileB and so on...Everything is wrapped in an UpdatePanel to avoid postbacks.I have a problem binding the download link in the ImageButton.navigateurl, and then downloading it. I don't know how to do it...
I read many posts about outputcaching element in asp .net MVC, but i have one question.My architecture is :1 master page, 1 page (especially news information), and a few other controls like LogOnUser / Fixed status bar etc...I want to have my news cached cause there are three query to entities, but i need too the title for SEO of my master page (title is included in a contentplaceholder in master).I tried to use renderaction outputcache but it is not possible to retrieve the title from the renderaction. Have you any idea about this problem ?Maybe it's preferable to use a general outputcache and use a substitute from dynamic data, but i don't know if it's a best practice or not.
I am trying to understand the difference between a RenderPartial and RenderAction. I guess that RenderPartial is like a UserControl and RenderAction is like a server-side include.
We are using renderaction provided by MVC futures. We've noticed that HttpExceptions in child action methods are not propagated to the parent action. Even though a fragment has failed, we still see the parent request resulting in a 200, and this throws our error handling for a toss.
I'm implementing Outputcache in my application and it works fine, but the first time always take a lot to load and the next following request will be faster...
I would like to know if there is a way to initiate the page caching on the server side and serve the cached page upon the very first request, rather than have it triggered by the user one first time.
Is is possible to initiate a partial page update whenever a client makes an update (say inserrting a record) and this will update the panel of all clients who are actually viewing the page ie eliminate the use of a timer control to refresh the panel each second because am getting many problems when using timercontrol.
I am using MVC 2 and am having problems getting the OutputCache to work. My ASP.NET website has Several Views and a View Master Page. On my View Master Page I have a Menu on the left hand side displaying navigation links (implemented using JQuery).
I have implemented the Menu as a PartialView and I call this PartialView from my MasterPage using Html.RenderAction. This all works fine, my controller fetches the data from the database and the PartialView is populated.
The problem is I want to cache the Menu data since it's consistent on all pages. Yet when I add the OutputCache parameter to my Action it has no effect.
@{Html.RenderAction("Detail", "Help", new { pageName = "press" });} But instead i'd like to use a lambda expression to get away from the string bits. I tried using the following (which is the nearest approximation i could figure based on my limited knowledge of the engine):
@{Html.RenderAction<HelpController>(x => x.Detail("press"));} But i get the following error:
The non-generic method 'System.Web.Mvc.Html.ChildActionExtensions.RenderAction(System.Web.Mvc.HtmlHelper, string, string, System.Web.Routing.RouteValueDictionary)' cannot be used with type arguments
However, i'm reading in the Apress MVC 2.0 book that it is in fact declared as a method that takes type arguments. Am i missing an assembly reference, or has it not been included in the MVC 3.0 Preview 1 build?
in my masterpage of my asp.net mvc 2 app. This method returns the version of the application.
i also have this code in my controller:
class GenericController : BaseController { [ChildActionOnly] public string Version() { try { string assemblyFile = Assembly.GetCallingAssembly().FullName; FileInfo fi = new FileInfo(assemblyFile); string version = fi.LastWriteTime.Year.ToString( ) + fi.LastWriteTime.Month.ToString() + fi.LastWriteTime.Day.ToString(); return version; } catch (Exception e) { return "1.0"; } } }
Now i get this error: Execution of the child request failed. Please examine the InnerException for more information.
and the innerexcpetion is: {"The controller for path '/Account/LogOn' was not found or does not implement IController."}
What i was thinking is that maybe the code can't execute because the user is not logged on yet, and tries to redirect to the logon method etc.
So the first thing i was thinking is to grant access in the web.config (like i do with the directory that has the css and images in it, it should also be accessable when you're not logged on:
im extending the htmlhelper. but it i cannot call the renderaction of it.
using System.Text; using System.Web.Mvc; using System.Web.Mvc.Html; public static class ViewHelpers { public static string Text(this HtmlHelper htmlHelper, string name, object value, bool isEditMode) { htmlHelper.RenderAction(...) //cannot be called } }
I am using Actionfilter to globally filter our HTML comments from all action methods and in all controllers. It simply overrides OnActionExecuting and runs the response through a regex to filter the comments. I am also using RenderAction to render some more complicated widgets in my website. There is no caching in place, I just use Renderactionto keep my code as simple possible.
When calling RenderAction from within a Razor View, I get an error message telling me that "Filtering is not allowed". The problem does not occur when calling RenderAction from within an aspx View. It only occurs when calling RenderAction from within a Razor View. In case it matters: the view being rendered is implemented with ASPX. Is this a bug or a known limitation?
I am working in an environment with many teams who are responsible for specific content on pages. Each team is sharing specific information (common class libraries, and master pages) that each are going deliver different types of content.Is it possible for an MVC application to do something similar to RenderPartial and pass a model to another MVC application Controller/Action to return content?
So the code for this might look like: (http://www.mydomain.com/Home/Index)
After rendering a view on a Post, a call to RenderAction inside the view will call for the Post method. Is there any way to specify I want to call the Get method instead of the Post?