使用_layout页面传递给多个视图的变量

时间:2018-03-09 14:51:52

标签: javascript c# html asp.net-mvc

有没有人知道传递变量的方法,以便所有视图都可以访问该变量?

我希望我的应用允许用户从下拉列表中选择一年,然后由不同的视图用作全局变量。这是为了保存与该特定年份相关的记录。

我尝试过使用会话变量

控制器:

for (int i = 0; i < vm.years.Count; i++)
{
    Session.Add(vm.years[i].StartDate.Year + "/" + vm.years[i].EndDate.Year, vm.years[i].Id);
}

_Layout.cshtml:

<select class="float-right">
@foreach (var a in Session)
{
    <option value="@a">@a</option>
}                 
</select>

但是,这似乎不是最好的方法,就像刷新页面而丢失会话变量一样,如果更改页面,则值会更改回下拉列表中的第一个值。

使用模型的局部视图并在_layout页面中渲染局部视图会更好吗?

1 个答案:

答案 0 :(得分:0)

考虑到ADyson的建议,我得到的解决方案如下:

控制器:将年份存储在字符串列表中,然后将其存储在单个会话变量年份中。

List<string> years = new List<string>();

for (int i = 0; i < vm.taxYears.Count; i++)
{
     years.Add(vm.taxYears[i].StartDate.Year + "/" + vm.taxYears[i].EndDate.Year);
}

Session["years"] = years;

查看:将会话变量中的变量年份作为字符串列表分配,并循环遍历它们以获取所有年份作为选项。

@{ 
    var years = Session["years"] as List<string>;
}

<select id="yearSelect" class="float-right custom-select" onchange="storeYear(this.value)">
   @foreach (var a in years)
   {
       <option value="@a">@a</option>
   }
</select>

Javascript:将值存储在localStorage中,这样当您更改为其他页面时,所选值保持不变。

function storeYear(yearVal) {
   var currentVal = document.getElementById("yearSelect").value;
   localStorage.setItem('selectVal', currentVal);
   location.reload();
}

$(document).ready(function () {
    if (localStorage.selectVal) {  
        //Select the value stored
         $("#yearSelect").val(localStorage.selectVal);
    }
});