When I discovered vsdocs files, I thinked about a way to have intellisense in my JQuery files to manipulate objects I'll send to my ASP.net MVC back end.
Something like MVC Model but just for JQuery Ajax callbacks.
The folowing JQuery method is available here is used to transfert clicked element html custom tags to an object designed to feed an ajax callback : The parameters coming from the html object are transfered to an object keept in memory while confirm dialog is displayed.
$.fn.MenuItemConfirmRemove = function (evt) {
savedEvt = evt;
RemoveLayoutMenu_JSonModel.DirectURL = $(this).attr("data-DirectURL"),
RemoveLayoutMenu_JSonModel.LayoutMenu_Translation_Id = $(this).attr("data-id"),
RemoveLayoutMenu_JSonModel.LayoutMenuTranslationLayoutMenuParent = $(this).attr("data-LayoutMenuTranslationLayoutMenuParent")
MenuItemAction = RemoveLayoutMenu_JSonModel;
$.fn.jqDialogConfirm(cap_RemoveMenuItemConfirmTitle, cap_RemoveMenuItemConfirmMessage, cap_RemoveMenuItemConfirmOkButtonTitle, cap_RemoveMenuItemConfirmCancelButtonTitle, "$.fn.MenuItemRemove");
evt.preventDefault();
}
the $.fn.MenuItemRemove is the method called by the generic dialog when user click the ok button. The generic dialog is available here
$.fn.MenuItemRemove = function () {
$('#dialogMessage').dialog('close');
ajaxData = JSON.stringify(MenuItemAction);
$.ajax(
{
type: "POST",
url: "/DynaStructure/LayoutMenuItemRemoveItem/" + $("#hidLanguage").val(),
data: ajaxData,
contentType: "application/json",
async: false,
success: $.fn.MenuUpdated,
error: function (xhr, ajaxOptions, thrownError) {
$.fn.jqDialogAlert(DialogErrorTitle, (xhr.responseText));
}
});
}
As you can see, MenuItemAction is filled BEFORE the confirm dialog is loaded and opened.
MenuItemAction (declared globally) is filled with RemoveLayoutMenu_JSonModel
Then, in the controller, I have to use a C# object to receive this JQuery object like that :
/// <summary>
/// Remove a menu
/// Warning, Removing a Menu remove also its translations
/// </summary>
/// <param name="layoutMenu"></param>
/// <returns></returns>
[HttpPost, Authorize(Roles = "Admin")]
public JsonResult LayoutMenuItemRemoveItem(string language, RemoveLayoutMenu_JSonModel ajaxModel)
{
JsonResult toReturn = new JsonResult { JsonRequestBehavior = JsonRequestBehavior.AllowGet };
string eMethod = eMethodBase + "LayoutMenuItemRemoveItem[POST]";
object eParameters = new { ajaxModel = ajaxModel };
string defaultLanguage = ConfigurationManager.AppSettings["DefaultLanguage"];
MembershipUser currentUser = Membership.GetUser();
LayoutMenu_Translation dbLayoutMenu_Translation;
using (DataRepositories _dataContext = new DataRepositories())
{
Language dbLanguage = _dataContext.Language_Rep.Query(x => x.Description == language).FirstOrDefault();
if (dbLanguage == null)
{
throw new INNOVACALL.Framework.Common.InnovacallExceptions.DataIntegrityException(eMethod, eParameters, string.Format(Resources.ErrMsg_LayoutMenuItemRemove_UnknownLanguage, language));
}
using (TransactionScope TS = new TransactionScope())
{
try
{
if (ajaxModel.LayoutMenuTranslationLayoutMenuParent == null)
{
dbLayoutMenu_Translation = _dataContext.LayoutMenu_Translation_Rep.Query(x => x.Id == ajaxModel.LayoutMenu_Translation_Id && x.LayoutMenu.FK_LayoutMenu == null).FirstOrDefault();
}
else
{
dbLayoutMenu_Translation = _dataContext.LayoutMenu_Translation_Rep.Query(x => x.Id == ajaxModel.LayoutMenu_Translation_Id && x.LayoutMenu.FK_LayoutMenu == ajaxModel.LayoutMenuTranslationLayoutMenuParent).FirstOrDefault();
}
if (dbLayoutMenu_Translation == null)
{
INNOVACALL.Framework.Common.InnovacallExceptions.DataIntegrityException iex = new INNOVACALL.Framework.Common.InnovacallExceptions.DataIntegrityException(eMethod, eParameters, Resources.DynaStructure_MenuAction_MenuNotFound);
iex.LogIt();
throw iex;
}
LayoutMenu dbLayoutMenu = dbLayoutMenu_Translation.LayoutMenu;
//We check if parent LayoutMenu has child
if (dbLayoutMenu_Translation.LayoutMenu.LayoutMenu1.Count > 0)
{
toReturn.Data = new { @success = false, @divToUpdate = "", @html = "", @scriptToExecute = "$.fn.jqDialogAlert('My Pretty CMS',a.message,'');", @message = Resources.DynaStructure_RemoveMenu_MenuHasChildren };
}
else
{
string[] tLanguages = ConfigurationManager.AppSettings["Languages"].Split(',');
foreach (string currentLanguage in tLanguages)
{
Language dbCurrentLanguage = _dataContext.Language_Rep.Query(x => x.Description == currentLanguage).FirstOrDefault();
if (dbCurrentLanguage == null) throw new INNOVACALL.Framework.Common.InnovacallExceptions.DataIntegrityException(eMethod, eParameters, Resources.Err_LanguageNotFound);
dbLayoutMenu_Translation = dbLayoutMenu.LayoutMenu_Translation.Where(x => x.FK_Language == dbCurrentLanguage.Id).FirstOrDefault();
if (dbLayoutMenu_Translation != null)
{
List<int> Structure_PagesIdsToKill = _dataContext.Structure_Page_Rep.Query(x => x.FK_LayoutMenu_Translation == dbLayoutMenu_Translation.Id).Select(x => x.Id).ToList();
foreach (int Structure_PagesIdToKill in Structure_PagesIdsToKill)
{
Structure_Page dbStructure_PageToKill = _dataContext.Structure_Page_Rep.GetById(Structure_PagesIdToKill);
ManagedContent toRemove = dbStructure_PageToKill.ManagedContent.SingleOrDefault();
if (toRemove != null)
{
_dataContext.ManagedContent_Rep.Remove(toRemove);
_dataContext.Save();
_dataContext.Structure_Page_Rep.Remove(dbStructure_PageToKill);
_dataContext.Save();
}
}
_dataContext.LayoutMenu_Translation_Rep.Remove(dbLayoutMenu_Translation);
_dataContext.Save();
}
}
string layoutMenuNameToRemove = dbLayoutMenu.Name;
_dataContext.LayoutMenu_Rep.Remove(dbLayoutMenu);
_dataContext.Save();
Logger.Info(enLog.Business, string.Format("User [{0}] removed layout menu [{1}]", (currentUser == null ? "#Anonymous#" : currentUser.UserName), layoutMenuNameToRemove));
}
TS.Complete();
}
catch (INNOVACALL.Framework.Common.InnovacallExceptions.DataIntegrityException iex)
{
TS.Dispose();
toReturn.Data = new { @success = false, @scriptToExecute = "$.fn.jqDialogAlert('My Pretty CMS',a.message,'');", @message = iex.Message };
return toReturn;
}
catch (Exception ex)
{
TS.Dispose();
INNOVACALL.Framework.Common.InnovacallExceptions.CommonException iex = new INNOVACALL.Framework.Common.InnovacallExceptions.CommonException(eMethod, eParameters, ex.Message);
iex.LogIt();
toReturn.Data = new { @success = false, @scriptToExecute = "$.fn.jqDialogAlert('My Pretty CMS',a.message,'');", @message = ex.Message };
return toReturn;
}
}
string newMenuBar = RenderMenuBar(_dataContext, dbLanguage, defaultLanguage);
toReturn.Data = new { @success = true, @divToUpdate = "#divMenuBar", @html = newMenuBar, @scriptToExecute = "$.fn.DocReady();", @message = "" };
}
return toReturn;
}
The source of the ASP.net MVC 4 controller is here
I repeat, the question...
Did you try to generate JSon objects based on C# class and use it to see intellisense in your javascript code when you use it ?