0

我是 MVC 的新手,我需要对 ASP .NET MVC 的一些概念有所了解。

在业余时间,我正在尝试了解有关 MVC 构建 Web 应用程序以管理一些用户内容的更多信息。有关更多详细信息,您可以在此处查看我之前关于同一应用程序的问题。

现在我被困在应该将视图模型传递给视图的控制器操作上,我需要知道一些事情。所以我想知道我是否以及在哪里做错了

1)在PortafoglioIndexViewModel我添加了一个用户属性来获取视图内的用户名。在视图中,我调用Model.Username 以在页面上显示用户名。它有效,但由于我IEnumerable<>@model指令中删除了,我无法再遍历该对象。我的代码和循环内部的智能感知标记为红色。 @Html.DisplayNameFor(model => model...)@Html.DisplayFor(modelItem => item...)foreach

如果我更改@modelIEnumerable<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>
4

1 回答 1

0

一种方法是创建一个包含用户详细信息和IEnumerableofPortafoglioIndexViewModel的 ViewModel,如下所示:

第 1 步:创建新的包装器,WrapperViewModel(作为示例名称):

public class WrapperViewModel
{
    public string Username { get; set; }
    public IEnumerable<PortafoglioIndexViewModel> Children { get; set; }

    public WrapperViewModel()
    {

    }

    public WrapperViewModel(string userName, IEnumerable<PortafoglioIndexViewModel> children)
    {
        Username = userName;
        Children = children;
    }

}

第 2 步:在控制器中,WrapperViewModel使用您的结果填充并传递给视图。所以替换return View(result);为:

return View(new WrapperViewModel(userName, result));

第 3 步:需要更改视图以适应新的WrapperViewModel

@model FundMonitor.Web.ViewModels.WrapperViewModel

@{
    ViewBag.Title = "Portafogli di " + Model.Username;
}

<h2>I miei portafogli</h2>

<p>
    @Html.ActionLink("Crea nuovo", "Create")
</p>

@if (Model.Children != null)
{
    <table>
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.Children.First().Etichetta)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Children.First().DataCreazione)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Children.First().NumeroFondi)
            </th>
            <th></th>
        </tr>

        @foreach (var item in Model.Children)
        {
            <tr>
                <td>
                    @Html.DisplayFor(x => item.Etichetta)
                </td>
                <td>
                    @Html.DisplayFor(x => item.DataCreazione)
                </td>
                <td>
                    @Html.DisplayFor(x => 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>
}

希望这能给你一些方向......

于 2013-03-20T15:00:27.277 回答