私は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>