【问题标题】:How to get a property value from database based on cascaded drop down list selected values??如何根据级联下拉列表选择值从数据库中获取属性值?
【发布时间】:2016-11-13 16:12:02
【问题描述】:

我想根据从级联下拉列表中传递所选项目的 id 来获取实体的属性...在级联下拉列表的第 1 级或第 2 级的每次更改时,都必须更新价格。

我已经实现了级联下拉列表。在页面加载时,Leaguedropdown (Level 1) 填充,第二个 LeagueDivisiondropdown (Level 2) 当我从 Level 1 中选择任何项目时填充。我必须实现 Price Calculator 应该根据级联下拉列表中的选定项目计算价格值,所有价格都存储在数据库中,我正在使用实体框架。 我正在使用 .change() 方法并为 2 级发送 getJson 请求,这工作正常。我也希望在级别 1 上具有相同的功能,但我已经使用 .change() 方法来填充 LeagueDivision,所以我也不知道如何在级别 1 上实现它。

如果有人指导我,我将不胜感激。

这是视图和脚本

<body>
<p id="message"></p>
@using (Html.BeginForm("PriceCalculatorIndex", "PriceCalculator", FormMethod.Post,
                                      new { enctype = "multipart/form-data" }))
{

    <div>
        @Html.LabelFor(m => m.SelectedLeague, new { @class = "control-lebel" })
        @Html.DropDownListFor(m => m.SelectedLeague, Model.LeagueList, new { @class = "form-control" })
        @Html.ValidationMessageFor(m => m.SelectedLeague)
    </div>
    <div>
        @Html.LabelFor(m => m.SelectedLeagueDivision, new { @class = "control-lebel" })
        @Html.DropDownListFor(m => m.SelectedLeagueDivision, Model.LeagueDivisionList, new { @class = "form-control" })
        @Html.ValidationMessageFor(m => m.SelectedLeagueDivision)
    </div>
    <div>
        @Html.LabelFor(m => m.Price)
        @Html.DisplayFor(m => m.Price)
    </div>
}
<!-- JS includes -->
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script src="//netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js"></script>
<script src="//ajax.aspnetcdn.com/ajax/jquery.validate/1.11.1/jquery.validate.min.js"></script>
<script src="//ajax.aspnetcdn.com/ajax/mvc/4.0/jquery.validate.unobtrusive.min.js"></script>
<script type="text/javascript">
    var leaguedivisionUrl = '@Url.Action("Fetchleaguedivision")';
    var updatePrice = '@Url.Action("updatePrice")';
    var divisions = $('#SelectedLeagueDivision');
    $('#SelectedLeague').change(function () {
        divisions.empty();
        $.getJSON(leaguedivisionUrl, { ID: $(this).val() }, function (data) {
            if (!data) {
                return;
            }
            divisions.append($('<option></option>').val());
            $.each(data, function (index, item) {
                divisions.append($('<option></option>').val(item.Value).text(item.Text));
            });
        });
    });

    $('#SelectedLeagueDivision').change(function () {

        $.getJSON(updatePrice, { LeagueDivisionId: $(this).val(), LeagueId: $('#SelectedLeague').val() }, function (data) {
            if (!data) {
                return;
            }
            alert(data);
            //document.getElementById('#message').innerHTML = data;
        });
    });
</script>

从数据库中获取价格的 JSON 结果

 public JsonResult updatePrice(int LeagueId, int LeagueDivisionId)
    {

        HostBoostersDBEntities2 db = new HostBoostersDBEntities2();
        CalculatorPrice updatedPrice = db.CalculatorPrices
           .Where(x => x.LeagueId == LeagueId
               &&
               x.LeagueDivisionId == LeagueDivisionId)
               .FirstOrDefault();
        decimal updatedPriceToView = (decimal)updatedPrice.Price;
        return Json(updatedPriceToView.ToString(), JsonRequestBehavior.AllowGet);
    }

【问题讨论】:

  • 您可以在$('#SelectedLeague').change() 函数中进行多次ajax 调用(只需在$.getJSON(leaguedivisionUrl, ... 代码之后复制$.getJSON(updatePrice.... 代码(但修改您发送的值)。但是您需要考虑会发生什么当SelectedLeagueDivision 的值为null 时,会抛出异常,因为参数是int 并且是必需的。
  • @StephenMuecke 请看一下我的回答...感谢您的指导并寻求您的进一步指导...谢谢

标签: javascript c# jquery asp.net-mvc getjson


【解决方案1】:

请尝试此代码。在您认为我仍然误解问题的地方提供我的 javascript cmets 的参考。

<script type="text/javascript">
    var leaguedivisionUrl = '@Url.Action("Fetchleaguedivision")';
    var updatePrice = '@Url.Action("updatePrice")';
    var divisions = $('#SelectedLeagueDivision');

    function bindLeagueDivisionData(data) {
        divisions.empty();
        $.each(data, function(index, item) {
            divisions.append($('<option></option>').val(item.Value).text(item.Text));
        });
    }

    function getUpdatedPrice(leagueId, divisionId) {
        $.getJSON(updatePrice, {
            LeagueDivisionId: divisionId,
            LeagueId: leagueId
        }, function(data) {
            if (!data) {
                return;
            }
            alert(data);
            //document.getElementById('#message').innerHTML = data;
        });
    }

    $('#SelectedLeague').change(function() {
        if (divisions.find("option").length == 0) {
            /*The division list is empty, fetch the divisions*/
            $.getJSON(leaguedivisionUrl, {
                ID: $(this).val()
            }, function(data) {
                if (!data) {
                    return;
                }
                /*Once division data is bound, get the price for the league and first selected division. If you choose to leave first division as empty, your wish; just remove the contents of done in that case*/
                $.when(bindLeagueDivisionData(data)).done(function() {
                    getUpdatedPrice($(this).val(), $('#SelectedLeagueDivision'));
                });
            });
        } else {
            /*Divisions are already present just get the price for the combination*/
            getUpdatedPrice($(this).val(), $('#SelectedLeagueDivision'));
        }
    });

    $('#SelectedLeagueDivision').change(function() {
        /*Get the price for the combination*/
        getUpdatedPrice($('#SelectedLeague').val(), $(this).val());
    });
</script>

【讨论】:

  • 这就是我想要的......如果我有 5 个联赛和 5 个联赛分区,那么总组合是 25,这意味着 25 个不同的价格存储在一个 sql 表中。我想更新 League 或 LeagueDivisions 中的每次更改的价格......两个下拉列表都工作正常,但我想学习如何根据这 25 种组合从数据库中获取值
  • @ajaysinghdav10d ....例如,如果我选择 League = Bronze 和 LeageDivision = LeagueDivision1 那么它应该更新价格......如果我只更改 League = Gold 和 LeageDivision = LeagueDivision1 的选择保持不变,它应该找到相应的记录等等......
  • @ajaysinghdav10d ......亲爱的它没有按照你的指导工作......我已经以其他方式实现了它
  • @ajaysinghdav10d...我真的很感谢您的努力...谢谢...请看看我的答案并指导我是否有其他最佳方式...我是如何得到什么的我想要
  • 嗨,Sulaiman,你的回答是可以的,只要它符合目的。只是一个问题,第一次调用 LoadPrice 不会返回任何内容,因为您的 Division 的第一个元素是空白的。这是预期的行为吗?
【解决方案2】:

我已经通过这种方式成功实现了。

@using (Html.BeginForm("PriceCalculatorIndex", "PriceCalculator", FormMethod.Post,
                                      new { enctype = "multipart/form-data" }))
{

    <div>
        @Html.LabelFor(m => m.SelectedLeague, new { @class = "control-lebel" })
        @Html.DropDownListFor(m => m.SelectedLeague, Model.LeagueList, new { @class = "form-control" })
        @Html.ValidationMessageFor(m => m.SelectedLeague)
    </div>
    <div>
        @Html.LabelFor(m => m.SelectedLeagueDivision, new { @class = "control-lebel" })
        @Html.DropDownListFor(m => m.SelectedLeagueDivision, Model.LeagueDivisionList, new { @class = "form-control" })
        @Html.ValidationMessageFor(m => m.SelectedLeagueDivision)
    </div>
    <div>
        <label>
            price :
        </label>
        <span id="spPrice"></span>
    </div>
}
<!-- JS includes -->
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script src="//netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js"></script>
<script src="//ajax.aspnetcdn.com/ajax/jquery.validate/1.11.1/jquery.validate.min.js"></script>
<script src="//ajax.aspnetcdn.com/ajax/mvc/4.0/jquery.validate.unobtrusive.min.js"></script>
<script type="text/javascript">
    $(function () {
        LoadDivisionsAndPrice()
    });
    var leaguedivisionUrl = '@Url.Action("Fetchleaguedivision")';
    var updatePrice = '@Url.Action("updatePrice")';
    var divisions = $('#SelectedLeagueDivision');
    $('#SelectedLeague').change(function () {
        LoadDivisionsAndPrice();
    });
    $('#SelectedLeagueDivision').change(function () {
        LoadPrice();
    });
    function LoadPrice() {
        $.getJSON(updatePrice, { LeagueId: $('#SelectedLeague').val(), LeagueDivisionId: $('#SelectedLeagueDivision').val() }, function (data) {
            if (!data) {
                return;
            }
            document.getElementById('spPrice').innerText = data.Price;
        });
    }
    function LoadDivisionsAndPrice()
    {
        divisions.empty();
        $.getJSON(leaguedivisionUrl, { ID: $('#SelectedLeague').val() }, function (data) {
            if (!data) {
                return;
            }
            divisions.append($('<option></option>').val());
            $.each(data, function (index, item) {
                divisions.append($('<option></option>').val(item.Value).text(item.Text));
            });
            LoadPrice();
        });
    }        
</script>

【讨论】:

  • 第一次加载页面时不需要调用LoadDivisionsAndPrice()(页面第一次加载时这些值应该已经在模型中)。 LoadPrice() 存在潜在问题,因为 SelectedLeagueDivision 的值可以是 null,这会在 updatePrice() 方法中引发异常。在调用控制器方法之前检查SelectedLeague 和SelectedLeagueDivision 都不为空。
  • @StephenMuecke 没有在第一次加载时调用LoadDivisionsAndPrice() 只是League 加载...我想加载所有我打电话的原因...现在我再次尝试不调用LoadDivisionsAndPrice只需 League 加载。
  • 那你的 GET 方法有问题。如果SelectedLeague 有一个值,那么Model.LeagueDivisionList 应该填充相关的SelectList。同样Price 应根据SelectedLeague 和SelectedLeagueDivision 的值填充到GET 方法中。要将视图发送到浏览器,然后立即再次调用服务器,因为您首先“忘记”发送正确的数据是没有意义的。
  • @StephenMuecke 请记住,您教我正确的方法来从您的小提琴中实现级联下拉列表,其中在首页加载时没有填充任何内容......它只显示please select city,在选择@987654342 之后@,locality 填充然后sub-locality 选择locality....但我想实现此链接中的行为hotsboosters.com/boosting 对不起,我想我无法表达我的观点,这就是为什么共享此链接,以便您了解我想要实现的内容,并且通过在首次加载时调用 LoadDivisionsAndPrice() 获得相同的行为
  • 你需要回去研究DotNetFiddle - 特别是ConfigureViewModel() 方法中的代码:) 不要在第一次加载视图时调用LoadDivisionsAndPrice,因为这些值应该已经是如果您在 GET 方法中的代码正确,则加载。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-15
  • 2018-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多