Передайте модель контроллеру с помощью 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
{
}