如何将jquery中的模型作为JSON变量传递?

时间:2015-06-04 15:53:58

标签: jquery json asp.net-mvc asp.net-mvc-4 razor

在MVC / Razor页面上,我有一个模型视图,其中一个元素是另一个模型的列表。该列表使用局部视图写入视图。因此,如果列表包含3个元素,则视图中有3行。我想使用JSON发送整个列表的值,以便我可以执行一些计算。如何使用JSON将模型的值或模型列表部分中的元素传递给控制器​​?

所以我的页面看起来像这样:

-------------------------
|                       |
| | ID |  | Price |     |
| | ID |  | Price |     |
| | ID |  | Price |     |
|                       |
-------------------------

我想使用JSON将每个ID和价格(可变行数)发送到控制器以执行计算。像这样:

 $("#btnCreateContract").click(function () {

    var url = '/CreateContract/CheckSalesSlips';

    $.getJSON(
        url
        ,
         {
           cashPrice: $("#txtCashDownPayment_rev").val()
           , salesSlip: model
         }
        , function (response)
        {
        status = response.status;
        }
       );

    return status;
});

控制器有这样的方法:

    [HttpGet]
    public JsonResult CheckSalesSlips(string cashPrice, ModelSalesSlips salesSlips)
    {
        decimal total = 0.00M;
        foreach (var item in salesSlips)
        {
            total = total + item.Price;
        }

        if (total.ToString() != cashPrice) // Check that sales slip item equals the amount financed.
        {
            return Json(new { status = true }, JsonRequestBehavior.AllowGet);
        }
        else
        {
            return Json(new { status = false }, JsonRequestBehavior.AllowGet);
        }

    } // CheckSalesSlips

但是,我收到的消息是模型未定义。我也试过

salesSlip: '<%= Model.salesSlips %>'

salesSlip: '<%= Model %>'

和其他变体,但salesSlip变量在到达控制器时始终为空。

如果我只有一个控件(即有一个价格字段),我可以使用控件的ID来获取值。然而,在我的情况下,我有可变数量的控件。

有人可以告诉我如何在jquery中通过JSON传递模型吗?如果这不可能,我怎么能将可变数量的控制值传递给控制器​​?

如果你看过我以前的帖子,这是我的第一个MVC项目,我也是Razor,jquery和JSON的新手,所以请放轻松我。谢谢!

以下是其他一些代码:

页面的主要模型,ModelApplication.cs:

public class ModelApplication
{
    public int Id { get; set; 
    public List<ModelSalesSlip> salesSlips { get; set; }
}

列表中元素的模型,ModelSalesSlip:

public class ModelSalesSlip
{
    public int ID { get; set; }
    public decimal Price { get; set; }
}

视图的相关部分,CreateContract.Mobile.cshtml:

@model Models.ModelApplication
@{
    ViewBag.Title = "CreateContract.Mobile";
    Layout = "~/Views/Shared/_AdminMaster.Mobile.cshtml";
    HtmlHelper.ClientValidationEnabled = true;
}
@using (Html.BeginForm(new { id="formCreateContract", @class = "form-horizontal ", @commandname = "ModelApplication" }))
{
   @{
     foreach (var item in Model.salesSlips)
     {
       <tr>
      @{
         Html.RenderPartial("CreateContractPartial", item);
       }
      </tr>
     }
<input id="btnCreateContract" type="submit" value="Save" name="CreateContract" />
}

部分视图,CreateContractPartial.Mobile.cshtml:

<div class="editorRow">
@using (Html.BeginCollectionItem("salesSlips"))
 {
    <td> @Html.TextBoxFor(x => x.ID, new { @class = "wide" })</td>
    <td> @Html.TextBoxFor(x => x.Price, new { @class = "wide" })</td>
 }
 </div>

1 个答案:

答案 0 :(得分:1)

您说要退回所有商品,但POST方法有参数ModelSalesSlips salesSlips(即一个ModelSalesSlips商品,而非收藏品。)

您可以使用.serialize()函数将所有表单控件值发送回控制器

var url = '@Url.Action("CheckSalesSlips", "CreateContract")'; // don't hardcode urls!
$("#btnCreateContract").click(function () {
  $.getJSON(url, $(form.serialize(), function(response) {
    ....
  });
});

并且控制器方法将是

public JsonResult CheckSalesSlips(string cashPrice, List<ModelSalesSlips> salesSlips)

您尚未使用id="txtCashDownPayment_rev"显示输入,但假设其name="cashprice"且在<form>标记内,则其值将绑定到参数cashPrice在方法中(但你真的应该使用带有decimal CashPrice { get; set; }附加属性的视图模型,并使用强类型助手创建输入,然后回发到public JsonResult CheckSalesSlips(YourViewModel model))。

但是,由于您似乎在比较decimal值的总和,因此参数cashPrice应该是decimal的类型,而不是string

然而,当您可以在客户端上轻松执行此检查时,所有这些似乎都是不必要的带宽浪费 - 例如

var total = 0;
$(.editorRow).each(function(index, item) {
  total += new Number($(this).find('input[type="text"]).last().val());
});
if (new Number($("#txtCashDownPayment_rev").val()) == total)
{
  ....