0

vsdocs ファイルを発見したとき、ASP.net MVC バックエンドに送信するオブジェクトを操作するために、JQuery ファイルに Intellisense を組み込む方法を考えました。

MVC モデルに似ていますが、JQuery Ajax コールバック専用です。

次の JQuery メソッドを使用して、クリックされた要素の html カスタム タグを ajax コールバックをフィードするように設計されたオブジェクトに転送します。html オブジェクトからのパラメーターは、確認ダイアログが表示されている間、メモリ内に保持されるオブジェクトに転送されます。

$.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();
}

$.fn.MenuItemRemove は、ユーザーが [OK] ボタンをクリックしたときに汎用ダイアログによって呼び出されるメソッドです。 一般的なダイアログはこちらから入手できます

$.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));
        }
    });

}

ご覧のとおり、確認ダイアログがロードされて開かれる前に、MenuItemAction が入力されます。

MenuItemAction (グローバルに宣言) は RemoveLayoutMenu_JSonModel で埋められます

次に、コントローラーで、C# オブジェクトを使用して、この JQuery オブジェクトを次のように受け取る必要があります。

    /// <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;
    }

ASP.net MVC 4 コントローラーのソースはこちら

繰り返しますが、質問...

C# クラスに基づいて JSON オブジェクトを生成し、それを使用して JavaScript コードでインテリセンスを使用しようとしましたか?

4

1 に答える 1

0

私はこのクラスを作成しました(確かに改善できます)

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Reflection; 
using System.Web.Script.Serialization;

namespace INNOVACALL.Framework.Common.POCOT4.MVCViewJSObjects {
public class JQClass
{
    private string arg;
    private string sAssemblyName;
    private Assembly assem;
    private Type[] types;

    public Type[] GetTypes()
    {
        return types;
    }

    public JQClass(string sAssemblyName)
    {
        assem = Assembly.LoadFrom(sAssemblyName);
        types = assem.GetTypes();
    }

    public Object CreateInstance(Type type)
    {
        Object myObject = Activator.CreateInstance(type);
        return myObject;
    }

    public List<Type> ObtientListTypesMeta(List<string> ListNom)
    {
        List<Type> listMetaTypes = new List<Type>();
        foreach (string nom in ListNom)
        {
            listMetaTypes.Add(types.ToList().Find(p => p.Name == nom));
        }
        return listMetaTypes;
    }

    public List<string> ObtientListChaineJS(List<string> lstName)
    {
        List<Type> lstTypes = new List<Type>();
        lstTypes = this.ObtientListTypesMeta(lstName);

        List<string> lstObjetJS = new List<string>();
        foreach(Type typeCourant in lstTypes)
        {
            string jqclassMetaData = typeCourant.Name;
            object metaData = this.CreateInstance(typeCourant);

            JavaScriptSerializer serializer = new JavaScriptSerializer();
            serializer.MaxJsonLength = Int32.MaxValue;

            string objetjson = serializer.Serialize(metaData).ToString();

            string chaineJS = "var " + jqclassMetaData + " = " + objetjson;
            lstObjetJS.Add(chaineJS);
        }
        return lstObjetJS;
    }
}
}

このクラスは、C# クラスに基づいて JSON 文字列を生成する一種のヘルパーです。

次に、このような単純なPOCO T4を作成しました

<#@ template debug="true" hostSpecific="true" #>
<#@ output extension=".js" #>
<#@ Assembly Name="System.Core.dll" #>
<#@ Assembly Name="System.Windows.Forms.dll" #>
<#@ assembly name="System.Web.Extensions.dll" #>
<#@ Assembly Name="$(SolutionDir)\..\Framework\bin\Debug\INNOVACALL.Framework.Common.dll" #>
<#@ Assembly Name="$(SolutionDir)\..\Portals\MVC4Portal\bin\MyPrettyCMS.dll" #>
<#@ import namespace="System" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Diagnostics" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Collections" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.Reflection" #>
<#@ import namespace="System.Web.Script.Serialization" #>
<#@ import namespace="INNOVACALL.Framework.Common.POCOT4.MVCViewJSObjects" #>
<#
List<string> lstName = new List<string>();
string myDll = string.Empty;
myDll = Assembly.GetAssembly(typeof(InnovaApp.Portals.MVC4Portal.Models.JSonModels.LayoutMenuItemFeed_JSonModel)).CodeBase;
lstName.Add( "LayoutMenuItemFeed_JSonModel");
myDll = Assembly.GetAssembly(typeof(InnovaApp.Portals.MVC4Portal.Models.JSonModels.MoveMenuElement_JSonModel)).CodeBase;
lstName.Add( "MoveMenuElement_JSonModel");
myDll = Assembly.GetAssembly(typeof(InnovaApp.Portals.MVC4Portal.Models.JSonModels.RemoveLayoutMenu_JSonModel)).CodeBase;
lstName.Add( "RemoveLayoutMenu_JSonModel");    
myDll = Assembly.GetAssembly(typeof(InnovaApp.Portals.MVC4Portal.Models.JSonModels.ToggleActivation_JSonModel)).CodeBase;
lstName.Add( "ToggleActivation_JSonModel");
JQClass jQClass = new JQClass(myDll);
List<string> lstObjetJS = jQClass.ObtientListChaineJS(lstName);
foreach(string objetJS in lstObjetJS)
{
#>
<#= objetJS #>
<# }
#>

ご覧のとおり、output extension=".js" を使用して js ファイルを生成しました。

この poco は、この単純なファイルを生成します (RemoveLayoutMenu_JSonMode を見てください)。

var LayoutMenuItemFeed_JSonModel = {"HtmlElementTUpdate":null,"DirectURL":null,"LayoutMenu_Translation_Id":0,"LayoutMenuTranslationLayoutMenuParent":null}
    var MoveMenuElement_JSonModel = {"DirectURL":null,"LayoutMenu_Translation_Id":0,"LayoutMenuTranslationLayoutMenuParent":null,"Direction":0}
    var RemoveLayoutMenu_JSonModel = {"DirectURL":null,"LayoutMenu_Translation_Id":0,"LayoutMenuTranslationLayoutMenuParent":null}
    var ToggleActivation_JSonModel = {"DirectURL":null,"LayoutMenu_Translation_Id":0,"LayoutMenuTranslationLayoutMenuParent":null}

私のコントローラーでは、_controller_base を使用してスクリプトをロードするように _layoutpage を指定します。ここで、T : _model_base

このような :

        if (this.AdminMode)
        {
            lstSpecificJqueryJSCollection.Add("JSonModels/JSonModelsMenuEdition1.js");
            lstSpecificJqueryJSCollection.Add("InnovacallJS/DynaContent/DynaContentAdmin.js");
            lstSpecificJqueryJSCollection.Add("ClientComponents/tiny_mce/tiny_mce.js");
        }

そしてインテリセンスを得るために:

生成されたスクリプトを、次のような標準の vsdoc であるかのように参照するだけです

///<reference path="/Scripts/ClientComponents/jquery/jquery-1.7.2-vsdoc.js" />
///<reference path="/Scripts/InnovacallJS/_Layout/_Layout.js" />
///<reference path="/ScriptsG/inoDynaContentDynamic.js" />
///<reference path="/Scripts/ClientComponents/KendoUI/kendo.web-vsdoc.js" />
///<reference path="/Scripts/JSonModels/JSonModelsMenuEdition1.js" />

この手法の大きな利点は、すべての C# クラス プロパティが JSON オブジェクトに転送されることを保証することです。

したがって、プロパティを追加する必要がある場合は、それを C# クラスに追加するだけです。それを保存し、POCO T4 を保存して、更新された JSON オブジェクトを再生成します。

于 2013-02-25T22:29:48.407 に答える