我想出了一些有用的東西。我的解決方案稍微複雜一點,但我會盡量發佈關鍵位以防萬一感興趣。
首先,我創建了以下插件:
$.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;
};
現在我的應用程序其實我有一個所見即所得的插件,嵌入在編輯器中我的自定義窗口小部件標籤。以下是你可以做什麼提交時從表單創建窗口小部件標籤爲例(這將被存儲在數據庫中):您需要更換上顯示小部件
$('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();
}
希望這有助於。
首先,我認爲將程序集名稱和類型暴露給html代碼是一個不好的主意,它可能是一個重大的安全漏洞......那麼,容納參數的類會一直存在嗎?或者你打算生成它? – ppetrov 2013-05-07 17:25:36
程序集名稱只會暴露給網站管理員。它將在顯示屏上被替換。該類用作參數傳遞給ASP.NET MVC操作方法的參數。 – nfplee 2013-05-08 07:41:02
你真的從數據庫中得到這個字符串嗎?或者你需要在帖子中獲得相應的模型嗎? – ppetrov 2013-05-08 09:31:59