Передайте модель контроллеру с помощью JQuery/Ajax
Я пытаюсь передать свою модель контроллеру с помощью JQuery/Ajax, я не уверен, как это сделать правильно. До сих пор я пытался использовать Url.Action
, но модель пуста.
Примечание. Ни один из повторяющихся потоков в stackoverflow, похоже, не использует ASP.NET 5 MVC 6.
Вид:
$("#inpDateCompleted").change(function () {
var url = '@(Url.Action("IndexPartial", "DashBoard", Model, null))';
$("#DailyInvoiceItems").load(url);
});
Контроллер:
[HttpGet]
public PartialViewResult IndexPartial(DashBoardViewModel m)
{
// Do stuff with my model
return PartialView("_IndexPartial");
}
Ответы
Ответ 1
Похоже, ваш метод IndexPartial
имеет аргумент, который является сложным объектом. Если вы передаете большое количество данных (сложный объект), может быть хорошей идеей преобразовать ваш метод действий в метод действия HttpPost
и использовать jQuery post
для публикации данных. GET имеет ограничение на значение строки запроса.
[HttpPost]
public PartialViewResult IndexPartial(DashboardViewModel m)
{
//May be you want to pass the posted model to the parial view ?
return PartialView("_IndexPartial");
}
Ваш script должен быть
var url = "@Url.Action("IndexPartial","YourControllerName")";
var model = { Name :"Shyju", Location:"Detroit"};
$.post(url, model ,function(res){
//res contains the markup returned by the partial view
//You probably want to set that to some Div.
$("#SomeDivToShowTheResult").html(res);
});
Предполагая, что Name
и Location
являются свойствами вашего класса DashboardViewModel
, а SomeDivToShowTheResult
- это идентификатор div на вашей странице, где вы хотите загрузить контент, поступающий из частичного просмотра.
Отправка сложных объектов?
Вы можете построить более сложный объект в js, если хотите. Привязка к модели будет работать до тех пор, пока ваша структура будет соответствовать классу viewmodel
var model = { Name :"Shyju",
Location:"Detroit",
Interests : ["Code","Coffee","Stackoverflow"]
};
$.ajax({
type: "POST",
data: JSON.stringify(model),
url: url,
contentType: "application/json"
}).done(function (res) {
$("#SomeDivToShowTheResult").html(res);
});
Чтобы приведенная выше модель js была преобразована в ваш параметр метода, ваша модель просмотра должна выглядеть примерно так.
public class DashboardViewModel
{
public string Name {set;get;}
public string Location {set;get;}
public List<string> Interests {set;get;}
}
И в вашем методе действий укажите [FromBody]
[HttpPost]
public PartialViewResult IndexPartial([FromBody] DashboardViewModel m)
{
return PartialView("_IndexPartial",m);
}
Ответ 2
//C# class
public class DashBoardViewModel
{
public int Id { get; set;}
public decimal TotalSales { get; set;}
public string Url { get; set;}
public string MyDate{ get; set;}
}
//JavaScript file
//Create dashboard.js file
$(document).ready(function () {
// See the html on the View below
$('.dashboardUrl').on('click', function(){
var url = $(this).attr("href");
});
$("#inpDateCompleted").change(function () {
// Construct your view model to send to the controller
// Pass viewModel to ajax function
// Date
var myDate = $('.myDate').val();
// IF YOU USE @Html.EditorFor(), the myDate is as below
var myDate = $('#MyDate').val();
var viewModel = { Id : 1, TotalSales: 50, Url: url, MyDate: myDate };
$.ajax({
type: 'GET',
dataType: 'json',
cache: false,
url: '/Dashboard/IndexPartial',
data: viewModel ,
success: function (data, textStatus, jqXHR) {
//Do Stuff
$("#DailyInvoiceItems").html(data.Id);
},
error: function (jqXHR, textStatus, errorThrown) {
//Do Stuff or Nothing
}
});
});
});
//ASP.NET 5 MVC 6 Controller
public class DashboardController {
[HttpGet]
public IActionResult IndexPartial(DashBoardViewModel viewModel )
{
// Do stuff with my model
var model = new DashBoardViewModel { Id = 23 /* Some more results here*/ };
return Json(model);
}
}
// MVC View
// Include jQuerylibrary
// Include dashboard.js
<script src="~/Scripts/jquery-2.1.3.js"></script>
<script src="~/Scripts/dashboard.js"></script>
// If you want to capture your URL dynamically
<div>
<a class="dashboardUrl" href ="@Url.Action("IndexPartial","Dashboard")"> LinkText </a>
</div>
<div>
<input class="myDate" type="text"/>
//OR
@Html.EditorFor(model => model.MyDate)
</div>
Ответ 3
Как было предложено в других ответах, вероятно, проще всего "POST" получить данные формы контроллеру. Если вам нужно передать всю модель/форму, вы можете легко сделать это с помощью serialize()
например.
$('#myform').on('submit', function(e){
e.preventDefault();
var formData = $(this).serialize();
$.post('/student/update', formData, function(response){
//Do something with response
});
});
Таким образом, ваш контроллер может иметь модель представления в качестве параметра, например.
[HttpPost]
public JsonResult Update(StudentViewModel studentViewModel)
{}
Альтернативно, если вы просто хотите опубликовать некоторые конкретные значения, которые вы можете сделать:
$('#myform').on('submit', function(e){
e.preventDefault();
var studentId = $(this).find('#Student_StudentId');
var isActive = $(this).find('#Student_IsActive');
$.post('/my/url', {studentId : studentId, isActive : isActive}, function(response){
//Do something with response
});
});
С контроллером, например:
[HttpPost]
public JsonResult Update(int studentId, bool isActive)
{}
Ответ 4
Используйте следующий JS:
$(document).ready(function () {
$("#btnsubmit").click(function () {
$.ajax({
type: "POST",
url: '/Plan/PlanManage', //your action
data: $('#PlanForm').serialize(), //your form name.it takes all the values of model
dataType: 'json',
success: function (result) {
console.log(result);
}
})
return false;
});
});
и следующий код на вашем контроллере:
[HttpPost]
public string PlanManage(Plan objplan) //model plan
{
}