【发布时间】:2017-02-26 13:02:32
【问题描述】:
对 MVC 还很陌生,但我遇到了一些绊脚石,我认为这很简单。
我的 _Layout 中有部分 _Header 视图。在这里,我想显示一个下拉列表,其中包含基于登录用户填充的项目列表。
在我项目的每个控制器中,我想检索选定的值并显示依赖于此的数据。
我尝试了几次,但总是卡在不同的位置。我正在创建一个基本控制器来保存我的项目列表和选定的项目值(都是静态的)。然后,在我的 AccountController 中,我可以在登录时填充这些值。我可以从我的其他控制器访问所有这些...但是如何在我的_Header 中填充下拉列表?我似乎无权访问这些。我什至走的是正确的路线吗?在经典的 ASP 中,我会将这些存储在视图状态中..
更新 - 根据 Marco 的建议
从控制器设置的 viewbag 值在视图中不可用(尽管可以访问) - 它总是返回 null。为了让事情更简单,我暂时将选择列表更改为简单的 int。代码如下
ViewPageBase -
public abstract class ViewPageBase : RazorPage
{
public int SelectedValue
{
get { return (ViewBag.SelectedValue == null ? 0 : ViewBag.SelectedValue); }
set { ViewBag.SelectedValue = value; }
}
}
public abstract class ViewPageBase<TModel> : RazorPage<TModel>
{
public int SelectedValue
{
get { return (ViewBag.SelectedValue == null ? 0 : ViewBag.SelectedValue); }
set { ViewBag.SelectedValue = value; }
}
}
基础控制器 -
public class BaseController : Controller
{
public int SelectedValue
{
get { return (ViewBag.SelectedValue == null ? 0 : ViewBag.SelectedValue); }
set { ViewBag.SelectedValue = value; }
}
}
AccountController : BaseController -
public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null)
{
ViewData["ReturnUrl"] = returnUrl;
if (!ModelState.IsValid)
return View(model);
var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, false);
if (result.Succeeded)
{
SelectedValue = 10;
_logger.LogInformation(1, "User logged in.");
return RedirectToLocal(returnUrl);
}
if (result.IsLockedOut)
{
_logger.LogWarning(2, "User account locked out.");
return View("Lock");
}
ModelState.AddModelError(string.Empty, "Invalid login attempt.");
return View(model);
}
_布局 -
@{ await Html.RenderPartialAsync("_Header"); }
在 _Header 中,我只是想读取 @SelectedValue 但这始终为空(在我的情况下为 0,因为我正在执行空检查)。
【问题讨论】:
-
您可以通过
ViewBag将数据放入您的_Layout(以及标题)。或者,您可以将 _Header 作为部分操作(而不是部分视图),在这种情况下,它将调用控制器并获取所需的任何数据。 -
"在我的 AccountController 中,我可以在 login" 上填充这些值 - 这就是无状态 MVC 控制器操作的工作方式。
标签: asp.net-mvc asp.net-core-mvc