簡體   English   中英

WPF或WinForms,類似於MVC查詢字符串的值提供程序/綁定

[英]WPF or WinForms, MVC querystring-like value provider/binding

我正在使用第三方Web瀏覽器控件進行WPF項目。 為了從網頁傳遞數據,我正在使用JavaScript進行重定向,然后取消瀏覽器的“ Navigating”事件(請參閱使用WebKit.NET從JavaScript調用C#函數)。

在導航事件中,我正在進行一些URL處理,以根據URL參數創建參數字典,然后調用特定方法(也基於URL)。

使用看起來像這樣的URL ='app-Method?arg1 = 5.3&arg2 = 3',我最終得到了一個包含以下信息的字典:

//var methodName = "Method";
//var dictionary = { { "arg1", "5.3" }, { "arg2", "3" } };

我無法在此階段進行轉換,因為不同的方法使用不同的類型會有不同的參數。

然后,我將這樣調用另一個方法(URL中的方法名稱):

switch(methodName)
{
     case "Method":
         Method(Convert.ToDecimal(dictionary["arg1"]), Convert.ToInt(dictionary["arg2"]));
         break;
}

顯然,在MVC中,HTTPGet操作方法完成了所有這些轉換,處理和方法調用。 我想知道是否(使用MVC庫或其他方法)可以在非MVC應用程序中復制這種行為,只是為了使代碼看起來更簡潔,並且如果有很多不同的方法則更加簡單。

我希望這是有道理的,我覺得很難解釋。

編輯:

這是完整的示例代碼:

this.browser.Navigating += (s, ev) =>
        {
            if (ev.Url.AbsoluteUri.Contains("app"))
            {
                var method = ev.Url.Host.Split('-')[1];
                var arguments = ev.Url.Query.TrimStart('?').Split('&');

                var dictionary = new Dictionary<string, string>();

                foreach (var arg in arguments)
                {
                    var split = arg.Split('=');

                    dictionary.Add(split[0], split[1]);
                }

                switch (method)
                {
                    case "add":
                        Add(Convert.ToInt32(dictionary["first"]), Convert.ToInt32(dictionary["second"]));
                        break;
                    default:                            
                        break;
                }

                ev.Cancel = true;
            }
        };

我想出了一種使用反射和JSON.net庫執行此操作的非常靈活的方法。 我更改了URL,以便將參數作為HTML編碼的JSON傳遞。 我通過所需的參數和循環使用JSON.net的ToObject方法將它們轉換為所需類型。 甚至在傳遞數組和復雜類型時也可以使用。

var jsonString = HttpUtility.UrlDecode(ev.Url.Query.TrimStart('?'));

var json = JObject.Parse(jsonString);

var methodInfo = objWithMethodToRun.GetMethod(methodName);

var parameterInfoArray = methodInfo.GetParameters();
var parameters = new object[parameterInfoArray.Length];

//Add parameters as correct types to array.
for (var i = 0; i < parameterInfoArray.Length; i++)
{
    var methodParameterInfo = parameterInfoArray[i];

    //If there is nothing in the json we'll set it to null
    if (json[methodParameterInfo.Name] == null || json[methodParameterInfo.Name].Type == JTokenType.Null)
    {
        parameters[i] = null;
    }
    else
    {
        var convertMethod = json[methodParameterInfo.Name].GetType().GetMethod("ToObject", new Type[] { })
                            .MakeGenericMethod(methodParameterInfo.ParameterType);

        parameters[i] = convertMethod.Invoke(json[methodParameterInfo.Name], null);
    }
}

//Invoke the method
dynamic result = methodInfo.Invoke(objWithMethodToRun, parameters);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM