当Dropdown SelectedItem发生变化时,Asp.Net MVC 5填充EditorFor

时间:2015-09-30 11:51:40

标签: jquery asp.net-mvc html.dropdownlistfor editorfor

当我从Dropdown中选择产品时,我需要填充Html.EditorFor控件。我是JQuery和Ajax的新手。

我的下拉列表:

@Html.DropDownList("ProductId", null, htmlAttributes: new { @class = "form-control", 
@onchange= "FillPrice()", id= "ProductId" })

EditorFor:

@Html.EditorFor(model => model.ProductPrice, 
                new { htmlAttributes = new { 
                           @class = "form-control",  
                           id="txtPrice" } })

使用Javascript:

function FillPrice() {
    var ProductId = $('#ProductId').val();
    $.ajax({
        url: '@Url.Action("GetPrice")',
        dataType: "JSON",
        data: { ProductId: ProductId },
        contentType: "application/json; charset=utf-8",
        success: function (price) {
            $('#txtPrice').val()   ??? What to write here to fill txtPrice?
        }
    });  
  }

控制器/用getPrice:

public JsonResult GetPrice(int ProductId)
{
    var price = from r in db.Products
                where r.Id == ProductId
                select new { 
                     id = r.Id, 
                     label = r.ProductPrice, 
                     value = r.ProductPrice };
    return Json(price, JsonRequestBehavior.AllowGet);
}

到目前为止,一切正常。我查看Firebug并查看Json get和结果,但我无法将值绑定到EditorFor。

1 个答案:

答案 0 :(得分:1)

JavaScript中的响应位于price变量:

function (price) {
    //...
}

基于服务器端代码,看起来该对象有三个值:

new { 
    id = r.Id, 
    label = r.ProductPrice, 
    value = r.ProductPrice }

(我不确定为什么你需要两次相同的值,但无论如何。)

所以你可能正在寻找那个变量的value属性?:

$('#txtPrice').val(price.value);

您还可以检查浏览器的调试器,并查看price变量的结构以确保。

编辑:看起来返回值可能是一个数组。鉴于服务器端代码导致IEnumerable<>,这是有道理的。如果它 只返回一个值,那么你可以明确表示。像这样:

return Json(price.Single(), JsonRequestBehavior.AllowGet);

您希望在其周围添加一些错误检查,并且处理错误的逻辑(找到多个值或找不到值)取决于您。

相反,如果您希望它是一个数组,您可以将其作为数组客户端访问:

$('#txtPrice').val(price[0].value);

同样,您想要添加一些错误检查(这次是在客户端代码中),以确保在尝试使用它之前存在一个值。