我已经为部分视图编写了一个操作,在其中调用选择列表,并在 _Layout.cshtml 中传递了相同的操作。 下拉菜单会在 Home/Index 操作上加载,但是当访问任何其他操作和控制器方法时,整个网站将停止工作。
家庭控制器操作
public IActionResult Index()
{
ViewBag.Proj = new SelectList(db.Projects.ToList(), "ProjectId", "ProjectName");
return View();
}
_布局.cshtml
@await Html.PartialAsync("~/Views/Home/_partial.cshtml")
我正在尝试获取选择列表并将其传递到一个表单中,该表单在单击按钮时打开并放置在标题菜单上。
根据你的描述,我建议你可以使用视图组件而不是使用部分视图。
视图组件可以直接注入服务以从数据库获取数据,并且可以将模型或视图包传递给组件视图,而无需传递所有控制器方法的所有数据。
更多关于如何使用它的细节,你可以参考下面的例子和这个链接:
1.创建Component类:
public class ProjectDropdownViewComponent : ViewComponent
{
public IViewComponentResult Invoke()
{
//you could modify the code to get the data from database
List<Project> projects = new List<Project>() { new Project { ProjectId=1, ProjectName="test" }, new Project { ProjectName = "test2", ProjectId = 2 } };
ViewBag.Proj = new SelectList(projects, "ProjectId", "ProjectName");
return View();
}
}
2.创建组件视图,路径如下:
请注意:视图组件视图路径需要匹配如下:
/Views/{Controller Name}/Components/{View Component Name}/{View Name}
/Views/Shared/Components/{View Component Name}/{View Name}
/Pages/Shared/Components/{View Component Name}/{View Name}
/Areas/{Area Name}/Views/Shared/Components/{View Component Name}/{View Name}
所以请创建如下路径的视图:
Views/Shared/Components/ProjectDropdown/Default.cshtml
查看代码:
<select asp-items="@ViewBag.Proj" class="form-control">
<option value="">-- Select Project --</option>
</select>
3.在布局中调用:
@await Component.InvokeAsync("ProjectDropdown")
<a class="navbar-brand" asp-area="" asp-controller="Home" asp-action="Index">CoreMVC</a>
结果: