布局页面的下拉列表 - MVC

4
我的问题:布局页面上的下拉列表。
我阅读了这篇文章:ASP.NET MVC Razor传递模型到布局,它与我的问题差不多。在评论中,Mattias Jakobsson写道:“但是一个常见的解决方案是使用RenderAction在布局页面中呈现需要自己的数据部分”。所以好吧,我创建了一个包含@Html.Action()的布局页面,它会从数据库中呈现我的下拉列表日期。一切都很完美。但是...
  1. 我有两个页面,例如:“主页”,“关于”和我在布局页面上的下拉列表(ddl)
  2. 如何实现当我在“主页”并更改ddl中的选择时,它会刷新“主页”,而当我在“关于”时,它会刷新“关于”页面。
  3. 如何通过页面存储所选的ddl值?
Layout.cshtml代码的一部分:
    .
    .
    <body>
    <header id="top" class="grid-full-margin">

        <strong id="logo" class="grid-304"><a href="/"><img src="/images/logo.png" ></a></strong>
        @Html.ActionLink(@Resources.Resource.BackToIntranet, "Index", "Home", null, new {@class = "link link-home grid-position-left"})

        <h1>@Resources.Resource.SiteTitle</h1>

        <a href="#" class="link link-help">@Resources.Resource.LayoutHelp</a>

        <nav clss="grid-896">

            <ul>
                <li>@Html.ActionLink(Resources.Resource.LayoutMenuItem1, "Index", "Home")</li>
                <li>@Html.ActionLink(Resources.Resource.LayoutMenuItem2, "Index", "ClimaticStation")</li>
                <li>@Html.ActionLink(Resources.Resource.LayoutMenuItem3, "Index", "ClimaticPoint")</li>
                <li>@Html.ActionLink(Resources.Resource.LayoutMenuItem4, "Index", "IcewaterExchanger")</li>
                <li>@Html.ActionLink(Resources.Resource.LayoutMenuItem5, "Index", "Pipeline")
                    <ul>
                        <li>@Html.ActionLink("Zestawienie", "YearsLength", "Pipeline")</li>
                    </ul>
                </li>
            </ul>

            <div class="mod-select-list tbl-actions">
                @Html.Partial("~/Views/Shared/Partials/LoginPartial.cshtml")
            </div>
        </nav>



    </header>
    <form action="#">
        @Html.Action("VariantsDdl", "MyBase")
    </form> 

    @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);
    }
   .
   .
   }

问候, 马欣

1个回答

5

好的,我已经成功解决了这个问题,并希望知道你对我的解决方案的看法。

_Layout.cshtml与第一篇文章时一样,因此下面只有这个问题最重要的部分(选择列表布局)。

    <div style="float: right;">
            @Html.Action("VariantsDdl", "MyBase")
    </div>

Action: VariantsDdl是在MyBaseController中实现的。此操作从会话中加载所选变量ID,如果为空,则从web.config加载(在这种情况下,项目要求数据库中必须至少有一个变体存在,并且其ID必须在配置中指定):

    [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'); }
        });

    });
});

Partial View的动作'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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接