0

私はMVCを初めて使用するので、ASP.NETMVCの概念について頭を悩ませる必要があります。

余暇には、MVCがいくつかのユーザーコンテンツを管理するためのWebアプリケーションを構築する方法についてもっと学びたいと思っています。詳細については、同じアプリケーションに関する以前の質問をここで確認できます。

今、私はビューモデルをビューに渡す必要があるコントローラーアクションで立ち往生しており、いくつかのことを知る必要があります。だから私は私が間違っているかどうか、そしてどこで間違っているのか知りたいです

1)PortafoglioIndexViewModelで、ビュー内のユーザー名を取得するためにUserプロパティを追加しました。Model.Username ビューで、ページにユーザー名を表示するために呼び出します。IEnumerable<>動作しますが、ディレクティブからを削除したため@model、オブジェクトを反復処理できなくなりました。私のコードとループ内の赤のIntellisenseマークアップ。 @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を確認し、データベース上のユーザーの正しいレコードのみを取得するために、ほぼすべてのコントローラー内でユーザー名/ユーザーIDを取得する必要があるため、ユーザー名/ユーザー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

IEnumerableこれに対する1つのアプローチは、ユーザーの詳細と次のPortafoglioIndexViewModelようなのを含む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 に答える