在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