我在使用模型和ViewModel时遇到了一些麻烦。
我需要在同一视图中列出所有帐单和用户。 (下拉列表中的用户)
另外:何时使用IEnumerable<T>
?因为依赖于我更改视图会更改错误消息。
public class Bill
{
public int Id { get; set; }
public string Title { get; set; }
public DateTime Date { get; set; }
public string Category { get; set; }
public double Amount { get; set; }
public Card Card { get; set; }
public int CardId { get; set; }
}
public class UserBills
{
public IEnumerable<ApplicationUser> User { get; set; }
public Bill Bill { get; set; }
}
@*@model IEnumerable<Nucontrol.Models.Bill>*@
@model IEnumerable<Nucontrol.ViewModels.UserBills>
@foreach (var item in Model)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.Bill.Card.Number)
</td>
<td>
@Html.DisplayFor(modelItem => item.Bill.Title)
</td>
<td>
@Html.DisplayFor(modelItem => item.Bill.Date)
</td>
<td>
@Html.DisplayFor(modelItem => item.Bill.Category)
</td>
<td>
@Html.DisplayFor(modelItem => item.Bill.Amount)
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { id = item.Bill.Id }) |
@Html.ActionLink("Details", "Details", new { id = item.Bill.Id }) |
@Html.ActionLink("Split", "Split", new { id = item.Bill.Id }, new { data_target = "#myModal", data_toggle = "modal" })
</td>
</tr>
}
<!-- List all users -->
@Html.DropDownListFor(m => User.Identity.Name, new SelectList(User.Identity.Name, "Id", "Name"), "", new { @class = "form-control" })
public ActionResult Index()
{
var users = _context.Users.ToList();
var bills = _context.Bills.ToList();
var viewModel = new UserBills
{
User = users
};
return View(viewModel);
}
答案 0 :(得分:1)
您提供的示例代码存在一些问题:
1)DropDownListFor
使用User.Identity.Name
属性作为模型绑定,它实际上是从IIdentity.Name
派生的,它是getter-only属性。使用setter声明另一个属性,该属性在viewmodel中保存用户ID。
2)将UserBills
视图模型传递到绑定到IEnumerable<UserBills>
模型的视图中可能会导致InvalidOperationException
。您需要使用从控制器传递IEnumerable<UserBills>
或定义@model UserBills
。
3)我建议您使用IEnumerable<SelectListItem>
从身份数据上下文生成的DropDownListFor
创建IEnumerable<ApplicationUser>
项,并将其传递给视图(另请参阅IdentityUser properties)。
以下是基于我的想法的初步解决方案:
<强>模型强>
public class UserBills
{
public int UserId { get; set; }
public IEnumerable<SelectListItem> Users { get; set; }
public IEnumerable<Bill> Bills { get; set; }
}
<强>控制器强>
public ActionResult Index()
{
var users = _context.Users.ToList();
var bills = _context.Bills.ToList();
var viewModel = new UserBills
{
Users = users.Select(x => new SelectListItem() { Value = x.Id.ToString(), Text = x.UserName.ToString() }),
Bills = bills
}
return View(viewModel);
}
查看强>
@model Nucontrol.ViewModels.UserBills
@foreach (var item in Model.Bills)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.Card.Number)
</td>
<!-- other properties -->
</tr>
}
@Html.DropDownListFor(m => m.UserId, Model.Users, "", new { @class = "form-control" })
注意:由于您从viewmodel绑定中获取了选定的用户ID,因此可以从该ID创建HttpContext.User
实例并设置User.Identity.Name
属性。