我是 MVC 的新手,我需要对 ASP .NET MVC 的一些概念有所了解。
在业余时间,我正在尝试了解有关 MVC 构建 Web 应用程序以管理一些用户内容的更多信息。有关更多详细信息,您可以在此处查看我之前关于同一应用程序的问题。
现在我被困在应该将视图模型传递给视图的控制器操作上,我需要知道一些事情。所以我想知道我是否以及在哪里做错了。
1)在PortafoglioIndexViewModel我添加了一个用户属性来获取视图内的用户名。在视图中,我调用Model.Username
以在页面上显示用户名。它有效,但由于我IEnumerable<>
从@model
指令中删除了,我无法再遍历该对象。我的代码和循环内部的智能感知标记为红色。 @Html.DisplayNameFor(model => model...)
@Html.DisplayFor(modelItem => item...)
foreach
如果我更改@model
为IEnumerable<FundMonitor.Web.ViewModels.PortafoglioIndexViewModel>
,那么我可以遍历对象,但如果我调用,Model.Username
我将不再获得对象属性,因为它是一个 IEnumerable。因此,在这种情况下,我发现获取 Username 属性的唯一方法是@using FundMonitor.Web.ViewModels
在视图顶部添加,然后进行强制转换,((PortafoglioIndexViewModel)Model).Username
但我认为这不是最佳实践......
那么我怎样才能得到山羊和卷心菜呢?
2)我在动作中填充和生成视图模型Index
的方式对吗?
3)什么是获取用户名/用户ID的更好方法,因为我需要它们在几乎每个控制器中检查用户身份并只获取用户在数据库上的正确记录?
控制器动作:
[Authorize]
public class PortafoglioController : Controller
{
private readonly FundMonitorDb _db = new FundMonitorDb();
//
// GET: /Portafoglio/
public ActionResult Index()
{
string userName = null;
if (HttpContext.User.Identity.IsAuthenticated)
{
userName = HttpContext.User.Identity.Name;
}
var result = from p in _db.Portafogli
join u in _db.UserProfiles on p.UserId equals u.UserId
where u.UserName.Equals(userName)
select new PortafoglioIndexViewModel
{
Id = p.Id,
DataCreazione = p.DataCreazione,
Etichetta = p.Etichetta,
NumeroFondi = p.Fondi.Count(),
Username = userName
};
return View(result);
}
}
视图模型:
public class PortafoglioIndexViewModel
{
public int Id { get; set; }
[Display(Name = "Etichetta")]
public string Etichetta { get; set; }
[Display(Name = "Creato il"), DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)]
public DateTime DataCreazione { get; set; }
[Display(Name = "N. fondi")]
public int NumeroFondi { get; set; }
public string Username { get; set; }
}
风景:
@model FundMonitor.Web.ViewModels.PortafoglioIndexViewModel
@{
ViewBag.Title = "Portafogli di " + Model.Username;
}
<h2>I miei portafogli</h2>
<p>
@Html.ActionLink("Crea nuovo", "Create")
</p>
<table>
<tr>
<th>
@Html.DisplayNameFor(model => model.Etichetta)
</th>
<th>
@Html.DisplayNameFor(model => model.DataCreazione)
</th>
<th>
@Html.DisplayNameFor(model => model.NumeroFondi)
</th>
<th></th>
</tr>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.Etichetta)
</td>
<td>
@Html.DisplayFor(modelItem => item.DataCreazione)
</td>
<td>
@Html.DisplayFor(modelItem => item.NumeroFondi)
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { id=item.Id }) |
@Html.ActionLink("Details", "Details", new { id=item.Id }) |
@Html.ActionLink("Delete", "Delete", new { id=item.Id })
</td>
</tr>
}
</table>