通过视图MVC中的javascript发布多个参数

时间:2015-11-13 10:24:32

标签: javascript c# asp.net-mvc razor

我想将文本框字段中所做的任何更改即时保存到我的数据库中,我有javascript将更改后的值传回控制器,但是我不知道如何传递唯一ID来保存更改后的值反对。
下面是我的价格将价格传回脚本,我该如何传递零件ID?

@foreach (var item in Model)
    {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.partid, new { id = "partCode"})
            </td>
            <td>
                @Html.DisplayFor(modelIem => item.partdesc)
            </td>
            <td>
                @Html.TextBoxFor(modelItem => item.price, new { id = "priceTextBox", @class = "mytext rightJustified" })
            </td>
        </tr>
    }

</table>


<script src="http://code.jquery.com/jquery-latest.js"></script>
<script>
$(function () {
    $('#priceTextBox').change(function () {
        var changedText = $(this).val();
        var partsJava = $("#partCode").val();
        
            //Post the content of your Textbox to your "YourAction" action in "YourController"
        $.post('@Url.Action("EnterNewSpecialPrice2", "SpecialPrices")', { "ChangedText": changedText, "PassPartCode": partsJava }, function (data) { });
            });
});
    </script>

2 个答案:

答案 0 :(得分:2)

定义一个类来保存与您在脚本中创建的Json对象匹配的两条信息:

 public class PartInputModel{

    public string ChangedText {get;set;}
    public string PassPartCode {get;set;}

 }

请注意,上面的属性必须与您在此处定义的属性相匹配:

{ ChangedText: changedText, PassPartCode: partsJava }

另请注意,在创建JSON结构时,必须删除ChangedText和PassPartCode定义周围的双引号,因为这些不是必需的。

更改控制器操作以接收此对象,并让模型绑定完成工作:

    [HttpPost]
    public ActionResult EnterNewSpecialPrice2(PartInputModel inputModel)   {
        // inputModel will have your two pieces of data 

    }

存储和检索id的更好机制是通过添加data-id标记将其作为数据标记附加到文本框的标记:

 @Html.TextBoxFor(m => item.price, new { id = "", @class = "priceTextBox mytext rightJustified", data_id="item.partid" })

然后更改脚本以阅读:

var partsJava = $(this).data('id');

这种方法的优点是,通过简单地扩展JSON结构并向PartInputModel类添加匹配属性,可以非常轻松地传递其他参数。

答案 1 :(得分:2)

由于重复的var partsJava = $("#partCode").val();属性而生成无效的html,而id="partCode"等选择器只能获得DisplayFor()的第一个元素的值。在任何情况下,它都是未定义的,因为id不生成元素(仅文本),并且它具有value属性或@foreach (var item in Model) { <tr> <td>@Html.DisplayFor(m => item.partid)</td> <td>@Html.DisplayFor(m => item.partdesc)</td> <td> @Html.TextBoxFor(m => item.price, new { id = "", @class = "priceTextBox mytext rightJustified", data_id="item.partid" }) </td> </tr> } 属性。将你的循环改为

$('.priceTextBox').change(function () {
    var changedText = $(this).val();
    var partsJava = $(this).data('id');
    $.post('@Url.Action("EnterNewSpecialPrice2", "SpecialPrices")', { "ChangedText": changedText, "PassPartCode": partsJava }, function (data) { });
    });
});

然后将脚本修改为

new { id="" }

请注意id删除public ActionResult EnterNewSpecialPrice2(string ChangedText, string PassPartCode) 属性,这样您就不会获得无效的HTML。

这当然假设你有一个方法

SpecialPricesController
PassPartCode中的

(虽然int可能是$scope.escapeQuotes= function(str) { return str .replace(/('|\")/g, "\\$1") .replace(/("|\")/g, "\\$1") }