Да, я знаю, что об этом спрашивали тысячу раз, но я искал и искал, и ни один из приведенных ответов, кажется, не дает правильного результата.
В основном, вывод, который я хочу, ниже.
{
"ResourceKey":"427693d6-16af-43a5-b6ff-89408cf460eb",
"ResourceCategory":"HierarchyLevelResource",
"Translations": [
{
"Translation": "English Hierarchy",
"CultureCode": "en-GB"
},
{
"Transation": "French Hierarchy",
"CultureCode": "fr-FR"
}
]
}
Но все ответы, похоже, выводят следующее:
{
"ResourceKey": "427693d6-16af-43a5-b6ff-89408cf460eb",
"ResourceCategory": "HierarchyLevelResource",
"Translations[0].Translation": "English Hierarchy",
"Translations[0].CultureCode": "en-GB",
"Translations[1].Translation": "French Hierarchy",
"Translations[1].CultureCode": "fr-FR"
}
C # MVC отлично переводит первый, так как для меня это правильно структурированный JSON, во втором примере он не преобразуетсяэлементы «Переводы».
Кто-нибудь знает какие-либо библиотеки, которые правильно переводят данные формы?Я использовал следующее, которое отлично работает для всего остального, кроме массивов.
$.fn.serializeObject = function () {
var o = {};
var a = this.serializeArray();
$.each(a, function () {
if (o[this.name] !== undefined) {
if (!o[this.name].push) {
o[this.name] = [o[this.name]];
}
o[this.name].push(this.value || '');
} else {
o[this.name] = this.value || '';
}
});
return o;
};
РЕДАКТИРОВАТЬ: Для получения дополнительной информации моя модель ...
public class CustomLocalisationModel
{
public string ResourceKey { get; set; }
public string ResourceCategory { get; set; }
public List<CustomLocalisationDataModel> Translations { get; set; }
}
public class CustomLocalisationDataModel
{
public string CultureCode { get; set; }
public string Translation { get; set; }
}
И она помещена вформа в следующем синтаксисе Razor ...
@using (Html.BeginForm("Index", "Localisation", FormMethod.Post, new {id = "translationsForm", novalidate = "novalidate", @class = "form-horizontal group-border-dashed", style = "border-radius:0px;"}))
{
@Html.HiddenFor(model => model.ResourceKey)
@Html.HiddenFor(model => model.ResourceCategory)
for (var translationIndex = 0; translationIndex < Model.Translations.Count(); translationIndex++)
{
<div class="form-group">
<label class="col-sm-2 control-label">@Model.Translations[translationIndex].LocalisedLanguageName</label>
<div class="col-sm-10">
@Html.TextBoxFor(model => Model.Translations[translationIndex].Translation, new { @class = "form-control", placeholder = PageLocaliser["PleaseEnterTranslation"].Value })
@Html.HiddenFor(model => Model.Translations[translationIndex].CultureCode)
</div>
</div>
}
<div class="form-group">
<div class="row xs-pt-15">
<div class="col-xs-6"> </div>
<div class="col-xs-6">
<p class="text-right">
<button id="btnSaveLocalisations" type="submit" class="btn btn-space btn-primary" onclick="return SaveLocalisations();">@CommonLocaliser["SubmitLabel"]</button>
<button id="btnCancel" data-dismiss="modal" type="submit" class="btn btn-space btn-default" onclick="return false;">@CommonLocaliser["CancelLabel"]</button>
</p>
</div>
</div>
</div>
}
РЕДАКТИРОВАТЬ 2:
Добавлен используемый метод Javascript.
function SaveLocalisations() {
console.log(JSON.stringify($('#translationsForm').serializeObject()));
$.ajax({
type: "POST",
url: "@Url.Action("Index", "Localisation", new {area = string.Empty})",
data: JSON.stringify($('#translationsForm').serializeObject()),
dataType: "json",
timeout: 7000,
contentType: "application/json",
success: function(msg) {
$.gritter.add({
position: "top-right",
title: "@CommonLocaliser["Success"]",
text: "@PageLocaliser["UpdateSuccessMessage"].Value",
class_name: 'clean img-rounded',
time: 5000
});
$('#localisationPartial').modal('hide');
},
error: function(XMLHttpRequest, textStatus, errorThrown) {
$.gritter.add({
position: "top-right",
title: "@CommonLocaliser["Failed"]",
text: "@PageLocaliser["UpdateFailedMessage"].Value",
class_name: 'clean img-rounded',
time: 5000
});
}
});
return false;
};