在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>
答案 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)
{
....