Свойства модели обновления MVC с использованием JQuery
Прошло много времени с тех пор, как я делал MVC/JQuery. Я ищу решение или лучший способ достижения этого.
Для упрощения у меня есть Модель со следующими свойствами:
public IEnumerable<XmlInputFieldModel> XmlFields { get; set; }
public IEnumerable<string> BusinessObjectFields { get; set; }
public IEnumerable<XmlSchemaField> MappedFields { get; set; }
public class XmlInputFieldModel
{
public string XmlElement { get; set;}
public string XmlValue { get; set; }
}
public class XmlSchemaField
{
public string XmlElement { get; set; }
public string BusinessObjectField { get; set; }
}
В моем представлении я предоставляю список элементов XmlField и их значений, и для каждого XmlField у меня есть раскрывающийся список для выбора BusinessObjectField, показанный ниже:
@foreach(var item in Model.XmlFields)
{
<div>
<div style="width: 300px; display: inline-block;">
@Html.DisplayFor(i => item.XmlElement)
</div>
<div style="width: 300px; display: inline-block;">
@Html.DisplayFor(i => item.XmlValue)
</div>
<div class="busoblist" data-elementid="@(item.XmlElement)" style="display: inline-block;">
@Html.DropDownListFor(m => m.BusinessObjectFields, new SelectList(Model.BusinessObjectFields, item.XmlElement))
</div>
<hr />
</div>
}
<div style="width: 200px; display: inline-block;">
<input type="button" name="Save" id="Save" />
</div>
Когда я нажимаю "Сохранить", я хочу, чтобы в моем свойстве MappedFields были указаны значения из данного элемента и выбранное значение раскрывающегося поля. Я попытался сделать это с помощью приведенного ниже сценария, но я не могу понять, как перейти из массива Key/Value в мою модель.
<script type="text/javascript">
$(document).ready(function () {
$("#Save").on("click", function () {
var mappedFields = new Array();
$('.busoblist').each(function() {
var element = $(this).attr('data-elementid');
mappedFields.push(element + ' : ' + $("option:selected", this).text() + ',');
});
var dataToSend = { Val: "Working" };
$.ajax({
url: "Home/SetMappedFields",
type: "POST",
data: dataToSend,
error: function(error) {
alert("Error: " + error.statusText);
},
success: function(result) {
alert("Result: " + result.statusText);
}
});
});
});
</script>
[HttpPost]
public ActionResult SetMappedFields(string Val)
{
string newVal = Val;
return this.RedirectToAction(x => x.Index());
}
Я исследовал маршрут Ajax (закомментированный код), но, похоже, не могу найти его, чтобы найти действие контроллера. Приведенный выше вид и скрипт находятся в частичном представлении, где заполняются другие свойства базовой модели.
@CSharper - я обновил приведенный выше код, и он все еще не попал в контроллер:( (я использую HomeController по умолчанию из запускаемого приложения MVC4). Функция My Error в сценарии возвращает "Ошибка: не найден".
1 ответ
Ajax не находит контроллер, потому что вы не определяете Ajax data:
и давая ему правильные параметры. Так что в свою очередь
url: "Home/SetMappedFields" + "?model=" + model + "&fields=" + mappedFields,
не является правильным. Если вы хотите вызвать этот метод из адресной строки или использовать window.open(), это сработает, но ajax ожидает параметры по-другому
(Внутри события, на которое вы хотите запустить вызов Ajax.)
var dataToSend = {
Val : "Working"
};
$.ajax({
url: "/Home/AjaxCall",
type: "POST",
data: dataToSend,
success: function (result) {
},
});
})
[HttpPost]
public ActionResult AjaxCall(string Val)
{
return View("Index");
}
var dataToSend = {
param1: value,
param2: value
};
Вот как вы можете ссылаться на несколько параметров