在ASP.NET核心控制器中初始化集合

在ASP.NET核心控制器中初始化集合,asp.net,asp.net-core,asp.net-core-1.1,Asp.net,Asp.net Core,Asp.net Core 1.1,我有一个控制器,它应该显示几个带有预定义值的选择(下拉列表) 我显示一个记录列表,每个记录可以有一个预定义的主题,并与预定义值列表中的城市相对应 我的控制器里有 private IEnumerable<Record> records; private static IEnumerable<Theme> themes; private static IEnumerable<City> cities; private async Task<bool>

我有一个控制器,它应该显示几个带有预定义值的选择(下拉列表)

我显示一个记录列表,每个
记录
可以有一个预定义的
主题
,并与预定义值列表中的
城市
相对应

我的控制器里有

private IEnumerable<Record> records;
private static IEnumerable<Theme> themes;
private static IEnumerable<City> cities;

private async Task<bool> LoadThemes()
{
    themes = await repository.GetTableEntitiesAsync<Theme>(lang);
    return true;
}

private async Task<bool> LoadCities()
{
    themes = await repository.GetTableEntitiesAsync<City>(lang);
    return true;
}
私有IEnumerable记录;
私人静态可数主题;
私有城市;
专用异步任务LoadThemes()
{
themes=wait repository.GetTableEntitiesAsync(lang);
返回true;
}
专用异步任务LoadCities()
{
themes=wait repository.GetTableEntitiesAsync(lang);
返回true;
}
行动呢

public async Task<IActionResult> Index()
{
    // records = from DB, then
    await LoadThemes(); ViewData["themes"] = this.themes;
    await LoadCities(); ViewData["cities"] = this.cities;

    return View(records);
}

public async Task<IActionResult> Edit(string id)
{
    // record => from id, then
    await LoadThemes(); ViewData["themes"] = this.themes;
    await LoadCities(); ViewData["cities"] = this.cities;

    return View(record);
}
公共异步任务索引()
{
//记录=来自数据库,然后
等待LoadThemes();ViewData[“themes”]=this.themes;
等待LoadCities();ViewData[“cities”]=this.cities;
返回视图(记录);
}
公共异步任务编辑(字符串id)
{
//记录=>来自id,然后
等待LoadThemes();ViewData[“themes”]=this.themes;
等待LoadCities();ViewData[“cities”]=this.cities;
返回视图(记录);
}

由于我不能执行异步构造函数,也不能确定是否通过
索引
视图传递,因此如何仅初始化一次“静态”集合?

在该场景中不应使用静态变量。相反,您只需将它们存储在局部变量中

查看

<form asp-controller="Index" asp-action="Sample" method="post">
    <select asp-for="Cities" asp-items="@Model.Cities"></select>
    <select asp-for="ThemeId" asp-items="@Model.Themes"></select>
    <button type="submit">Submit</button>
</form>

提交
视图模型

public class RecordViewModel
{
    public string Id { get; set; }
    public string ThemeId { get; set; }
    public string CityId { get; set; }
    public IList<SelectListItem> Themes { get; set; }            
    public IList<SelectListItem> Cities { get; set; }

    public RecordViewModel()
    {
        Themes = new List<SelectListItem>();
        Cities = new List<SelectListItem>();
    }
}
公共类RecordViewModel
{
公共字符串Id{get;set;}
公共字符串ThemeId{get;set;}
公共字符串CityId{get;set;}
公共IList主题{get;set;}
公共IList城市{get;set;}
公共记录视图模型()
{
主题=新列表();
城市=新列表();
}
}
控制器

public async Task<IActionResult> Index()
{
    var lang = "???";
    var model = new RecordViewModel
    {
        Themes = (await repository.GetTableEntitiesAsync<Theme>(lang))
            .Select(x => new SelectListItem {Value = x.Id,Text = x.Text}),
        Cities = (await repository.GetTableEntitiesAsync<City>(lang))
            .Select(x => new SelectListItem { Value = x.Id, Text = x.Text })
    };
    return View(model);
}

public async Task<IActionResult> Edit(string id)
{
    var lang = "???";
    var model = new RecordViewModel
    {
        Id = id,
        Themes = (await repository.GetTableEntitiesAsync<Theme>(lang))
            .Select(x => new SelectListItem { Value = x.Id, Text = x.Text }),
        Cities = (await repository.GetTableEntitiesAsync<City>(lang))
            .Select(x => new SelectListItem { Value = x.Id, Text = x.Text })
    };
    return View(model);
}
公共异步任务索引()
{
var lang=“?”;
var模型=新的RecordViewModel
{
主题=(wait repository.GetTableEntitiesAsync(lang))
.Select(x=>newselectListItem{Value=x.Id,Text=x.Text}),
Cities=(wait repository.GetTableEntitiesAsync(lang))
.Select(x=>newselectListItem{Value=x.Id,Text=x.Text})
};
返回视图(模型);
}
公共异步任务编辑(字符串id)
{
var lang=“?”;
var模型=新的RecordViewModel
{
Id=Id,
主题=(wait repository.GetTableEntitiesAsync(lang))
.Select(x=>newselectListItem{Value=x.Id,Text=x.Text}),
Cities=(wait repository.GetTableEntitiesAsync(lang))
.Select(x=>newselectListItem{Value=x.Id,Text=x.Text})
};
返回视图(模型);
}
其他想法

如果您不想创建两个视图——一个用于创建,另一个用于编辑,则您可能需要考虑创建部分视图<代码> .CREATORUPDATEC.CSHMTL< /Cord>,并在它们之间共享它们。这里有相应的方法和步骤


如果您不想每次查询数据库,您可能需要考虑使用MythyCaskasy.

在该场景中不应该使用静态变量。相反,您只需将它们存储在局部变量中

查看

<form asp-controller="Index" asp-action="Sample" method="post">
    <select asp-for="Cities" asp-items="@Model.Cities"></select>
    <select asp-for="ThemeId" asp-items="@Model.Themes"></select>
    <button type="submit">Submit</button>
</form>

提交
视图模型

public class RecordViewModel
{
    public string Id { get; set; }
    public string ThemeId { get; set; }
    public string CityId { get; set; }
    public IList<SelectListItem> Themes { get; set; }            
    public IList<SelectListItem> Cities { get; set; }

    public RecordViewModel()
    {
        Themes = new List<SelectListItem>();
        Cities = new List<SelectListItem>();
    }
}
公共类RecordViewModel
{
公共字符串Id{get;set;}
公共字符串ThemeId{get;set;}
公共字符串CityId{get;set;}
公共IList主题{get;set;}
公共IList城市{get;set;}
公共记录视图模型()
{
主题=新列表();
城市=新列表();
}
}
控制器

public async Task<IActionResult> Index()
{
    var lang = "???";
    var model = new RecordViewModel
    {
        Themes = (await repository.GetTableEntitiesAsync<Theme>(lang))
            .Select(x => new SelectListItem {Value = x.Id,Text = x.Text}),
        Cities = (await repository.GetTableEntitiesAsync<City>(lang))
            .Select(x => new SelectListItem { Value = x.Id, Text = x.Text })
    };
    return View(model);
}

public async Task<IActionResult> Edit(string id)
{
    var lang = "???";
    var model = new RecordViewModel
    {
        Id = id,
        Themes = (await repository.GetTableEntitiesAsync<Theme>(lang))
            .Select(x => new SelectListItem { Value = x.Id, Text = x.Text }),
        Cities = (await repository.GetTableEntitiesAsync<City>(lang))
            .Select(x => new SelectListItem { Value = x.Id, Text = x.Text })
    };
    return View(model);
}
公共异步任务索引()
{
var lang=“?”;
var模型=新的RecordViewModel
{
主题=(wait repository.GetTableEntitiesAsync(lang))
.Select(x=>newselectListItem{Value=x.Id,Text=x.Text}),
Cities=(wait repository.GetTableEntitiesAsync(lang))
.Select(x=>newselectListItem{Value=x.Id,Text=x.Text})
};
返回视图(模型);
}
公共异步任务编辑(字符串id)
{
var lang=“?”;
var模型=新的RecordViewModel
{
Id=Id,
主题=(wait repository.GetTableEntitiesAsync(lang))
.Select(x=>newselectListItem{Value=x.Id,Text=x.Text}),
Cities=(wait repository.GetTableEntitiesAsync(lang))
.Select(x=>newselectListItem{Value=x.Id,Text=x.Text})
};
返回视图(模型);
}
其他想法

如果您不想创建两个视图——一个用于创建,另一个用于编辑,则您可能需要考虑创建部分视图<代码> .CREATORUPDATEC.CSHMTL< /Cord>,并在它们之间共享它们。这里有相应的方法和步骤


如果您不想每次查询数据库,您可能需要考虑使用MythyCaskasy.< /P>:加载LoCyTeSes()方法中的城市或主题吗?i、 e.

cities=await…
我编辑了OP,以解释控制器中的点静态变量不能很好地替代实现真正的缓存。从一个方法返回一个布尔值,返回的唯一值为
true
也没有意义。是否在LoadCities()方法中加载城市或主题?i、 e.
cities=await…
我编辑了OP,以解释控制器中的点静态变量不能很好地替代实现真正的缓存。从一个方法返回一个布尔值,返回的唯一值为
true
也没有意义。好的,但是主题和城市的列表不会改变。是相同的常量值列表。每次在每个视图中加载它真的有必要吗?我的意思是,我可以在控制器的构造函数中再次加载它并将其用于所有视图吗?在这种情况下,使用静态变量缓存数据不是一种好的做法。此外,我们很少使用sta