MVC - 在jquery填充它之后选择正确的下拉选项

时间:2016-10-02 22:55:21

标签: jquery ajax asp.net-mvc razor

我正在创建一个编辑视图,该视图将根据编辑操作更改其内容和表单元素。我传递一个模型,将一个值存储在一个隐藏元素中,然后,一旦文档准备就绪,我使用ajax来填充下拉列表。紧接着我需要选择正确的选项,该选项等于隐藏元素中的值。 我的代码无法工作,我一直试图找出为期2天的原因。

剃刀

@Html.DropDownList("ddl_publisher", new List<SelectListItem>(), new { @class = "form-control form-group", @style = "display:none", @onchange = "storeNewPublisher()" });
@Html.Hidden("hid_publisher", Model.Value, new { @class = "form-control" })

JQUERY

$(document).ready(function(){
    loadPublishers();
    changeDDLSelection();
}

function changeDDLSelection() {
    publ = $("#hid_publisher").val();
    $("#ddl_publisher").val(publ).change();
}
function storeNewPublisher() {
    var publisherText = $("#ddl_publisher option:selected").text();
    var publisherValue = $("#ddl_publisher option:selected").val();
    var publisherStatus = publisherText.replace(publisherValue, '').replace('-', '').replace('[', '').replace(']', '').trim();
    $("#hid_publisher").val(publisherValue);
    $("#hid_publisherStatus").val(publisherStatus);
}

AJAX

function loadPublishers() {
    $.ajax({
        type: "GET",
        url: "/Filter/GetPublishers/",
        contentType: 'application/json',
        data: { productType : $("#ddl_filterProdType option:selected").val() },
        success: function (data) {
            $.each(data, function (i, pub) {
                $("#ddl_publisher").append('<option value="' + pub.Text + '"> [ ' + pub.Value + ' ] - ' + pub.Text + '</option>');
            });
         },
         error: displayPublishFailureMessage
     });
 }

调用成功,并且在 changeDDLSelection 内部变量 publ 具有正确的值,但下拉列表不会更改其选项(相反,它会执行此操作)如果我在Chrome控制台中执行代码)。 然而,更改会触发,因此会触发 storeNewPublisher ,但每个局部变量都是未定义

我不能把头撞到墙上,我的邻居们都在抱怨。

非常感谢提前

1 个答案:

答案 0 :(得分:0)

在您当前的实施中,您在changeDDLSelection之后调用loadPublishers方法。但这并不意味着你的第二个方法总是在changeDDLSelection方法完成它必须做的所有事情之后执行。如果你在每个方法中放入一个console.log,你会看到这个。

你应该做的是,在调用changeDDLSelection方法的ajax调用的success事件中调用loadPublishers方法(在附加结果数组中的所有选项之后)

function loadPublishers() {
    $.ajax({
        type: "GET",
        url: "/Filter/GetPublishers/",
        contentType: 'application/json',
        data: { productType : $("#ddl_filterProdType option:selected").val() },
        success: function (data) {
            $.each(data, function (i, pub) {
                $("#ddl_publisher").append('<option value="' + pub.Text +
                                   '"> [ ' + pub.Value + ' ] - ' + pub.Text + '</option>');
            });
            //Safely call the second method here
             changeDDLSelection();
         },
         error: displayPublishFailureMessage
     });
}
function changeDDLSelection() {
    var publ = $("#hid_publisher").val();
    $("#ddl_publisher").val(publ).change();
}

$(document).ready(function(){
    loadPublishers();       
}