布局页面上的下拉列表-MVC

 故事里的说书人 发布于 2023-01-30 19:16

我的问题:在布局页面上的下拉列表。

我读了这篇文章:ASP.NET MVC Razor通过模型来布局它或多或少与我的问题相似。Mattias Jakobsson在评论中写道:“但是,常见的解决方案是使用RenderAction在布局页面中呈现需要自己数据的零件”。好吧,我已经使用@ Html.Action()创建了布局页面,该页面呈现了带有数据库中日期的dwon列表。一切都很完美。但...

    我有两个页面,例如:“主页”,“关于”和布局页面上的下拉列表(ddl)

    当我在“主页”上并更改了ddl中的选择时,如何刷新“主页”页面,而在“关于”时刷新“关于”页面。

    如何通过页面存储选定的ddl值?

部分Layout.cshtml代码:

    .
    .
    
    
@Html.ActionLink(@Resources.Resource.BackToIntranet, "Index", "Home", null, new {@class = "link link-home grid-position-left"})

@Resources.Resource.SiteTitle

@Resources.Resource.LayoutHelp
@Html.Action("VariantsDdl", "MyBase")
@RenderBody() . .

部分 MyBaseController.cs

   public class MyBaseController : Controller
{
   [ChildActionOnly]
    public ActionResult VariantsDdl()
    {
        var dataFromDb = GetDataFromDB(); // it's not importstn right now
        return this.PartialView("~/Views/Shared/Partials/VariantsDdlPartial.cshtml", dataFromDb);
    }
   .
   .
   }

此致Marcin

1 个回答
  • 好的,我已经设法解决了这个问题,我想知道您的意见以及我的解决方案。

    _Layout.cshtml的外观与第一篇文章相同,因此,below仅是此问题的最重要部分(布局的下拉列表)

        <div >
                @Html.Action("VariantsDdl", "MyBase")
        </div>
    

    行动:VariantsDdl是在MyBaseController上实现的。此操作从会话中加载选定的变体ID,或者如果它为null,则从web.config中加载(在这种情况下,这是项目要求,必须在db中至少存在一个变体,并且必须在config中指定其变体):

        [ChildActionOnly]
        public ActionResult VariantsDdl()
        {
            long defaultVariantID;
            long.TryParse(System.Configuration.ConfigurationManager.AppSettings["DefaultVariantId"], out defaultVariantID);
    
            if (System.Web.HttpContext.Current.Session["mySelectedVariant"] != null)
            {
                long.TryParse(System.Web.HttpContext.Current.Session["mySelectedVariant"].ToString(), out defaultVariantID);
            }
    
            var variants = this.db.warianties.ToList();
            var items = new List<SelectListItem>();
            foreach (var variant in variants)
            {
                var selectedItem = false;
                if(variant.id == defaultVariantID)
                {
                    selectedItem = true;
                }
    
                items.Add(new SelectListItem { Selected = selectedItem, Text = variant.nazwa, Value = variant.id.ToString() });
            }
    
            return this.PartialView("~/Views/Shared/Partials/VariantsDdlPartial.cshtml", items);
        }
    

    将所选变体ID存储到会话的部分视图和发布操作:

        @model IEnumerable<SelectListItem>
    
        <label for="field">Current variant</label>
        @Html.DropDownList("Varaints", Model, new { id = "variantsDdl" })
    
       <script type="text/javascript">
    $(function () {
        $('#variantsDdl').change(function () {
            var val = $('#variantsDdl').val()
            $.ajax({
                type: "POST",
                url: '@Url.Action("ChangeVariant", "MyBase")' + '/' + val,
                success: function (result) {
                    location.reload();
                },
                error: function (data) { alert('Error'); }
            });
    
        });
    });
    

    部分查看后操作'ChangeVariant',将选定的变体ID保存到会话中:

       [HttpPost]
        public ActionResult ChangeVariant(long id = 0)
        {
            System.Web.HttpContext.Current.Session["mySelectedVariant"] = id;
    
            return null;
        }
    

    这是满足我要求的解决方案:1.布局中的DDL 2.在DDL“ onchange”处刷新当前页面3.保留选定的DDL值通过页面

    请评论它是否合适,或者我应该采用其他方式?

    此致Marcin

    2023-01-30 19:19 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有