0

我正在尝试采用 HTML 表单并序列化字段,以便可以将其存储为 JavaScript 中元素的属性(您可以使用 jQuery)。这可以稍后在 C# 中解析并转换为 .NET 类型。这必须适用于任何类型,因为表单是通过对服务器的 Ajax 调用生成的。

例如给出以下形式:

<form>
    <input type="text" name="Assembly" value="MyAssembly.dll" />
    <input type="text" name="Class" value="MyClass" />
    <input type="text" name="Parameters.Parameter1" value="5" />
    <input type="text" name="Parameters.Parameter2" value="10" />
</form>

它会产生类似的东西:

<widget assembly="MyAssembly.dll" class="MyClass" parameters="???"></widget>

笔记: ???将替换为 JSON 或 XML(取决于您认为最好的)。

现在假设我将此字符串存储在数据库中,我需要在服务器上对其进行解析以将其转换为 .NET 类型。我可以做一个正则表达式来获得适当的属性,留下以下变量:

var assembly = "MyAssembly.dll";
var @class = "MyClass";
var parameters = "???";

现在最后我需要将其序列化为 .NET 类型。

如果有人可以提供帮助,我将不胜感激。谢谢

4

1 回答 1

0

我想出了一些可行的方法。我的解决方案稍微复杂一些,但我会尝试发布关键位以防万一有人感兴趣。

首先,我创建了以下插件:

$.fn.serializeObject = function(prefix) {
    var o = {};

    // Serialize the form as an array
    var a = this.serializeArray()
        .filter($.proxy(function(element) {
            // Make sure the prefix matches and it is not a checkbox (this is needed since ASP.NET MVC renders a hidden checkbox for the false value)
            return element.name.indexOf(prefix || '') == 0 && $('[name=\'' + element.name + '\'][type=\'checkbox\']', this).length == 0;
        }, this));

    // Now append the checkbox values (this makes sure we only have one element in the array with the correct value whether it is selected or not)
    a = a.concat($('input[type=\'checkbox\']', this).map(function() {
            return { 'name': this.name, 'value': $(this).is(':checked') ? 'true' : 'false' }
        }).get());

    $.each(a, function() {
        var n = this.name.substr((prefix || '').length);

        if (o[n] !== undefined) {
            if (!o[n].push)
                o[n] = [o[n]];

            o[n].push(this.value || '');
        } else
            o[n] = this.value || '';
    });

    return o;
};

现在对于我的应用程序,我实际上有一个 WYSIWYG 插件,它在编辑器中嵌入了我的自定义小部件标签。这是一个示例,您可以在提交表单时从表单创建小部件标签(然后将其存储在数据库中):

$('form').submit(function(e) {
   var parameters = JSON.stringify($('form').serializeObject('Parameters.'));
   var widget = '<widget assembly="' + $('[name=\'Assembly\']').val() + '" class="' + $('[name=\'Class\']').val() + '" parameters="' + parameters + '"></widget>';
   ...
});

最后在服务器上,您需要通过执行以下操作替换显示的小部件:

output = Regex.Replace(output, @"<widget assembly=""(.*?)"" class=""(.*?)"" parameters=""(.*?)""></widget>", m => ReplaceWidget(m, helper));

这是 ReplaceWidget 方法:

private static string ReplaceWidget(Match match, HtmlHelper helper) {
    var assembly = match.Groups[1].Value;
    var @class = match.Groups[2].Value;
    var serializedParameters = match.Groups[3].Value;

    // Get the type
    var type = Assembly.LoadFrom(HttpContext.Current.Server.MapPath("~/bin/" + assembly)).GetType(@class);

    // Deserialize the parameters
    var parameters = JsonConvert.DeserializeObject(HttpUtility.HtmlDecode(serializedParameters), type);

    // Return the widget
    return helper.Action("Widget", "Widgets", new { parameters = parameters }).ToString();
}

希望这可以帮助。

于 2013-05-13T16:05:07.177 回答