我正在创建一个基本的CRUD应用程序。在我的详细信息视图中,我按照屏幕截图显示错误。
我创建了一个ViewModel来显示我的索引视图。 (多个成员)。我正在尝试重用该ViewModel来显示Details视图(单个成员)。
有人能发现我做错了吗:
这是我的详细信息视图:
@model IEnumerable<GymTracker.ViewModel.MemberViewModel>
@{
ViewData["Title"] = "Details";
}
<h2>Details</h2>
@foreach (var item in Model)
{
<div>
<h4>Member</h4>
<hr />
<dl class="dl-horizontal">
<dt>
@Html.DisplayNameFor(model => model.FirstName)
</dt>
<dd>
@Html.DisplayFor(modelItem => item.FirstName)
</dd>
<dt>
@Html.DisplayNameFor(model => model.LastName)
</dt>
<dd>
@Html.DisplayFor(modelItem => item.LastName)
</dd>
<dt>
@Html.DisplayNameFor(model => model.DateOfBirth)
</dt>
<dd>
@Html.DisplayFor(modelItem => item.DateOfBirth)
</dd>
<dt>
@Html.DisplayNameFor(model => model.PaymentType)
</dt>
<dd>
@Html.DisplayFor(modelItem => item.PaymentType)
</dd>
</dl>
</div>
<div>
<a asp-action="Edit" asp-route-id="@Model.MemberID">Edit</a> |
<a asp-action="Index">Back to List</a>
</div>
}
这是我在控制器中的详细信息操作方法:
public async Task<IActionResult> Details(int? id)
{
if (id == null)
{
return NotFound();
}
List<MemberViewModel> memberViewModel = new List<MemberViewModel>(); //declared my VIewModel instance
var listData = await (from member in _context.Members
where (member.Id == id)
join membershiptypes in _context.MembershipTypes on member.MembershipTypeId equals membershiptypes.MembershipTypeId
select new
{
member.Id,
member.FirstName,
member.LastName,
member.DateOfBirth,
membershiptypes.PaymentType
}
).ToListAsync();
listData.ForEach(x =>
{
MemberViewModel Obj = new MemberViewModel();
Obj.MemberID = x.Id;
Obj.FirstName = x.FirstName;
Obj.LastName = x.LastName;
Obj.DateOfBirth = x.DateOfBirth;
Obj.PaymentType = x.PaymentType;
memberViewModel.Add(Obj);
}
);
//link the viewModel instance to the context class somehow..
return View(memberViewModel);
}
最后,这是我用于详细信息和索引视图的ViewModel:
namespace GymTracker.ViewModel
{
public class MemberViewModel
{
public int MemberID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yyyy}")]
public DateTime DateOfBirth { get; set; }
public string PaymentType { get; set; }
}
}
非常感谢任何帮助,谢谢
答案 0 :(得分:2)
在您的视图中,您希望ListView of MemberViewModel是您的@Model
,您正试图访问导致问题的MemberViewModel列表上的MemberID
。
您可能需要做类似的事情
<a asp-action="Edit" asp-route-id="@item.MemberID">Edit</a>
或者,如果要为所有表项设置第一个MemberID。试试这个:
<a asp-action="Edit" asp-route-id="@Model.FirstOrDefault().MemberID">Edit</a>
答案 1 :(得分:1)
尝试
<a asp-action="Edit" asp-route-id="@item.MemberID">Edit</a> |
您的Model
是MemberViewModel
的IEnumerable,因此它没有MemberID属性。您为每个循环渲染了该链接,因此您需要使用item
变量
答案 2 :(得分:0)
Model
这里是序列(IEnumerable<T>
); IEnumerable<T>
确实没有该属性(@Model.MemberID
) - 但序列中的每个项目可能
你可能意味着:
@item.MemberID
或者,如果你真的打算回去整个项目序列,你需要使用类似的东西:
@foreach(var x in Model) {
// do something with x
}
或者只是
@(Model.First().MemberID)
或类似的