我的问题:在布局页面上的下拉列表。
我读了这篇文章:ASP.NET MVC Razor通过模型来布局它或多或少与我的问题相似。Mattias Jakobsson在评论中写道:“但是,常见的解决方案是使用RenderAction在布局页面中呈现需要自己数据的零件”。好吧,我已经使用@ Html.Action()创建了布局页面,该页面呈现了带有数据库中日期的dwon列表。一切都很完美。但...
我有两个页面,例如:“主页”,“关于”和布局页面上的下拉列表(ddl)
当我在“主页”上并更改了ddl中的选择时,如何刷新“主页”页面,而在“关于”时刷新“关于”页面。
如何通过页面存储选定的ddl值?
部分Layout.cshtml
代码:
. .@RenderBody() . .@Html.ActionLink(@Resources.Resource.BackToIntranet, "Index", "Home", null, new {@class = "link link-home grid-position-left"}) @Resources.Resource.SiteTitle
@Resources.Resource.LayoutHelp
部分 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
好的,我已经设法解决了这个问题,我想知道您的意见以及我的解决方案。
_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