使用 Jquery/Ajax 将模型传递给控制器

Posted

技术标签:

【中文标题】使用 Jquery/Ajax 将模型传递给控制器【英文标题】:Pass Model To Controller using Jquery/Ajax 【发布时间】:2016-03-01 02:16:46 【问题描述】:

我正在尝试使用 JQuery/Ajax 将我的模型传递给控制器​​,但我不确定如何正确执行此操作。到目前为止,我已经尝试使用Url.Action,但模型是空白的。

注意:*** 上的重复线程似乎都没有使用 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");
 

【问题讨论】:

有点不清楚你想做什么。 Url.Action() 的第三个参数将是您第一次生成视图时的原始模型,如果您的模型包含任何复杂对象或集合的属性,它无论如何都会失败。 那只会通过原始模型(Url.Action() 是在发送到视图之前在服务器上解析的剃须刀代码)。如果您只想将所选日期发送给方法,请使用 $("#DailyInvoiceItems").load('@(Url.Action("IndexPartial", "DashBoard")', date: $(yourdatecontrol).val()); ); 并将方法更改为具有 DateTime date 参数。 您可以使用$('form').serialize() 序列化表单中的所有控件。例如$.post('@(Url.Action("IndexPartial", "DashBoard"), $('form').serialize()`, function(data) $("#DailyInvoiceItems").html(data); ); 这就是$('form').serialize() 的作用。您的DashBoardViewModel m 参数将被正确绑定(假设您已正确生成表单控件) 这意味着您确实应该使用视图模型(即仅包含您在视图中需要的那些属性),但是不,您排除的任何属性将只是它们在方法中的默认值。 【参考方案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");

你的脚本应该是

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);
);

假设NameLocation 是您的DashboardViewModel 类的属性,而SomeDivToShowTheResult 是您要加载来自partialview 的内容的页面中一个div 的ID。

发送复杂对象?

如果你愿意,你可以在 js 中构建更复杂的对象。只要您的结构与视图模型类匹配,模型绑定就会起作用

var model =  Name :"Shyju", 
              Location:"Detroit", 
              Interests : ["Code","Coffee","***"]
            ;

$.ajax(
    type: "POST",
    data: JSON.stringify(model),
    url: url,
    contentType: "application/json"
).done(function (res) 
    $("#SomeDivToShowTheResult").html(res);
);

上面的js模型要转换成你的方法参数,你的View Model应该是这样的。

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);

【讨论】:

谢谢,关于 Post/Get,我了解,但在您的代码中显示您只是发布模型的一个参数,难道不能只传递整个模型吗?整个 DashboardVIewModel。 @Reafidy 查看下面的完整实现 @Reafidy 酷。查看***.com/a/20226220/40521,了解有关将模型发布到控制器的更详细说明。 jquery 返回后是否可以从 PartialView 中读取模型参数?例如,我想创建一个新元素并读取从控制器传回的新模型 ID 以添加额外的 dom 元素?我知道我可以将它包含在局部视图中,但是如果我想要与局部视图无关但具有该元素 id 的另一个部分的 Id 怎么办?【参考方案2】:

使用以下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


【讨论】:

在您的代码中添加一些解释,以便其他人更可重用答案。 这项技术对我来说非常简单有效。我将 ajax 调用放在带有 javascript 的 actionlink 上,而不是放在提交按钮上。【参考方案3】:
//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>

【讨论】:

@NEDian 感谢缩进 谢谢,使用 'var viewModel = Id : 1, MyDate:;'如何从页面上的文本框中获取一个值到 mydate 参数中? 对不起,我的意思是如何从文本框中获取日期到 viewModel 参数中? 很好,很抱歉 - 最后一个问题,我如何将 ajax 查询的结果加载到“#DailyInvoiceItems”DIV 中? 希望你能看到代码的变化以及你如何处理ajax调用成功的结果【参考方案4】:

正如其他答案中所建议的,将表单数据“发布”到控制器可能是最简单的。如果您需要传递整个模型/表单,您可以使用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)
     

【讨论】:

以上是关于使用 Jquery/Ajax 将模型传递给控制器的主要内容,如果未能解决你的问题,请参考以下文章

使用 jQuery Ajax 将对象列表传递给 MVC 控制器方法

如何使用 jquery ajax 将 web api 控制器中的 web 表单值作为模型类传递

使用 Jquery Ajax 将数组传递给 asp.net C# 控制器

jQuery AJAX 调用 PHP 控制器

如何将 JQuery AJAX 请求中的字符串值传递给 Spring Boot 控制器?

jquery Ajax 调用 - 数据参数未传递给 MVC 控制器操作