【问题标题】:MVC 2: How can I create links from Dropdown list options available when list datasource is a databaseMVC 2:当列表数据源是数据库时,如何从可用的下拉列表选项创建链接
【发布时间】:2011-02-10 09:09:33
【问题描述】:

所以我有多个列表,比如这个:

<%: Html.DropDownList("CPUList", new  SelectList((IEnumerable)ViewData["CPUList"], "Price", "Name"))%>

数据源是 LinQ to SQL *.dbml 模型

Controller 将数据分配给 ViewData,在字符串值“平台”上过滤结果:

     if (platform == "i7)
                {

                    var processor = from prod in _ctx.Products
                                   where prod.Attributes == 1366"
                                   select prod;

                    var ram = from prod in _ctx.Products
                                   where prod.Attributes == "TripleChannel"
                                   select prod;

                    ViewData["CPUList"] = processor;
                    ViewData["RAMList"] = ram;
}

基本上,我正在尝试 PC 自定义页面,理想情况下我会 喜欢人们能够点击他们选择的选项,比如链接 打开一个新的小窗口,其中包含所选组件的详细说明。 我已经有一个将 productID 作为参数的视图,基本上 显示任何特定产品的详细说明 (prod.LongDesc)。 除了我不知道如何创建下拉列表 链接每个可用选项/名称并创建将在新窗口中打开的正确 url。 这基本上是我编程的第一周,所以如果你认为我在实现这个功能方面走错了路,请告诉我,尽管根据参数根据需要填充列表,但到目前为止似乎工作得很好。

【问题讨论】:

    标签: c# sql asp.net-mvc linq asp.net-mvc-2


    【解决方案1】:

    在您的DropDownList 中,我宁愿使用产品 ID 作为值,这样您就可以对该产品 ID 执行 ajax 请求以获取有关它的更多信息。

    所以你可以有一个看起来有点像下面的动作:

        public ActionResult GetRam(Guid productId)
        {
            var cpu = Products.First(x => x.Id == productId);
    
            switch (cpu.Attribute)
            {
                case "1366":
                    ViewData["Ram"] = Products.Where(x => x.Attribute == "TrippleChannel").ToArray();
                    break;
                case "1155":
                    ViewData["Ram"] = Products.Where(x => x.Attribute == "DualChannel").ToArray();
                    break;
            }
    
            return PartialView("_RamList");
        }
    

    但是,您可能需要考虑在哪些部分相互兼容之间建立关系。但就目前而言,请考虑上述操作以使其变得容易。

    如果您的下拉列表中有产品 ID 作为值,您可以使用 jQuery 简单地执行以下操作:

    <script>
        $(document).ready(function () {
            $("#CPUList").change(function () {
                $.ajax({
                    url: '/Product/GetRam/' + $(this).val(),
                    dataType: 'html',
                    success: function (data) {
                        $('#RAMListPlaceHolder').html(data);
                });
            });
    
        });
    </script>
    

    其中RAMListPlaceHolderdiv,您将在其中放置部分视图_RamList 中的html

    【讨论】:

    • 有了你说的这种更精细的关系,它可以用LinQ到SQL查询在控制器中表达还是必须是Javascript/Ajax?
    • @LaserBeak,当您在 CPU 下拉列表中选择某些内容时,您仍然需要“触发”操作。但它会比 switch 语句好得多。您可能想研究 LINQ to EF 而不是 LINQ to SQL。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    • 2018-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多