0

我想制作两个级联下拉列表。当用户选择下拉列表中的项目时,此操作会触发:

 public SelectList myFunc(string item)
    {
        var query = //Query

        var sItems = new SelectList(query);
        ViewBag.StagesList2 = sItems;
        return ViewBag.StagesList2;
    }

这是我的脚本:

<script>
    var isChanged = false;
    $(function () {
        $('#stageOne').change(function () {
                $.ajax({
                    url: "/Shop/myFunc/",
                    data: { item: $("#stageOne option:selected").text() },
                    type: 'post',
                    success: function () {
                     document.getElementById("stageTwo").options.add(ViewBag.StagesList2);
                 }
            });

        });
    });
</script>

动作成功触发。但没有添加到我的第二个 dropdownlistfor :

    <div class="drop-down-list">
        <%: Html.DropDownListFor(model => model.StageId, Enumerable.Empty<SelectListItem>(),new { id="stageTwo"})%>
        <%: Html.ValidationMessageFor(model => model.StageId) %>
    </div>

问题是什么??

4

1 回答 1

0

您只能在构建页面时使用 viewbag。一旦浏览器显示页面,就没有更多的 viewbag 了。假设您执行以下操作:

ViewBag.MyName = "John Doe";

当您的页面加载时:

<h2>Welcome, <%: ViewBag.MyName %> ! </h2>

浏览器看到的唯一内容是:

<h2>Welcome, John Doe ! </h2>

浏览器不知道页面是如何构建的。它不知道 Viewbag,因为这是一个 ASP.NET 功能,它与浏览器无关。

您需要做的是在语句中传递StagesList2数据,然后在 ajax 调用的回调中处理该数据。returnsuccess

所以你的代码会变成这样:

public JsonResult myFunc(string item)
{
    var query = //Query, let's assume this passes a list of items with an ID and a Name field.


    return Json(query, JsonRequestBehavior.AllowGet); //This sends your query result back as a JSON object
}

那么您的 Ajaxsuccess回调将是:

success: function (myJSONdata) {
    //first, clear the current contents
    $("#stageTwo").html("");

    //Now proces the new items piece by piece        
    var items = myJSONdata.items;

    for(var i=0; i < items.length; i++) {
        var item = items[i];
        var optionhtml = '<option value="' + item.ID + '">' + item.Name + '</option>';

        $("#stageTwo").append(optionhtml); //Appends the above option to the selectlist
    }

    //Done!
    alert("Everything is now correctly processed!");
}

您必须检查字段的名称,我只是使用了一些示例,但我希望您对如何处理数据有一个大致的了解:)

随意问它是否不够清楚。

于 2013-03-04T10:24:06.770 回答