好的,我已经成功解决了这个问题,我想知道您对我的解决方案的看法。
_Layout.cshtml 看起来与第一篇文章相同,所以下面只是这个问题最重要的部分(布局中的下拉列表)
<div style="float: right;">
@Html.Action("VariantsDdl", "MyBase")
</div>
操作: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'); }
});
});
});
部分视图后操作“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值
请评论是否是合适的解决方案,或者我应该采取不同的方式?
问候,
马尔辛