我在完成一项非常简单的任务时遇到了麻烦。我正在尝试将从数据库检索到的值映射到视图模型。然后我想将它作为模型传递给我的视图。
视图模型称为 EditAdminModelVM,它包含来自称为 UserProfile 的较大类的属性的较小子集。我选择使用视图模型是因为我不希望用户能够更新整个域模型,而只更新其中的一部分。
这是视图模型:
public class EditAdminModelVM
{
[Required]
[StringLength(50, ErrorMessage = "The {0} must be at least {2} characters long.")]
[Display(Name = "First name")]
public string FirstName { get; set; }
[Required]
[StringLength(50, ErrorMessage = "The {0} must be at least {2} characters long.")]
[Display(Name = "Last name")]
public string LastName { get; set; }
[Required]
[MaxLength(250)]
[EmailAddress]
public string Email { get; set; }
[Required]
//[Remote("doesUserNameExist", "Account", HttpMethod = "POST", ErrorMessage = "Username already exists. Please enter a different User Name.")] //note this checks from client-side only - server side check is built in to membership
[Display(Name = "Username")]
public string UserName { get; set; }
[HiddenInput]
public int UserId { get; set; }
}
这是控制器 9 虽然它不起作用):
[Authorize(Roles = "Admin")]
public ActionResult EditAdmin(int id = 0)
{
PpDB db = new PpDB();
var viewModel = new EditAdminModelVM();
viewModel = db.UserProfiles
.Where(x => x.UserId == id)
.Select(x => new EditAdminModelVM
{
FirstName = x.FirstName,
LastName = x.LastName,
Email = x.Email,
UserName = x.UserName
});
return View(viewModel);
}
在这种情况下,.Select 带有下划线,其中显示了有关 IQueryable 的信息。但是如果我尝试设置 var viewModel = new IQueryable; 我得到另一个错误。
我想这可能是一个语法问题。这个数据库查询应该只返回一行,所以我不认为 IQueryable 是必要的,但我不是专家。
如果你能提供一个如何构建这个代码块的工作样本,那么我可以通过例子来学习——对我疲惫的大脑更好。
非常感激!
更新 KEN 这是更新后的控制器:
[Authorize(Roles = "Admin")]
public ActionResult EditAdmin(int id = 0)
{
PpDB db = new PpDB();
List<EditAdminModelVM> viewModel = new List<EditAdminModelVM>();
viewModel = db.UserProfiles
.Where(x => x.UserId == id)
.Select(x => new EditAdminModelVM
{
FirstName = x.FirstName,
LastName = x.LastName,
Email = x.Email,
UserName = x.UserName,
UserId = x.UserId
}).ToList();
return View(viewModel);
}
这是视图:
@model List<PpModels.Models.EditAdminModelVM>
@{
ViewBag.Title = "Edit Admin";
Layout = "~/Views/Shared/_Layout.cshtml";
}
@using (Html.BeginForm()) {
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<fieldset>
<legend>UserProfile</legend>
@Html.HiddenFor(model => model.UserId)
<div class="editor-label">
@Html.LabelFor(model => model.UserName)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.UserName)
@Html.ValidationMessageFor(model => model.UserName)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.FirstName)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.FirstName)
@Html.ValidationMessageFor(model => model.FirstName)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.LastName)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.LastName)
@Html.ValidationMessageFor(model => model.LastName)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Email)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Email)
@Html.ValidationMessageFor(model => model.Email)
<p>
<input type="submit" value="Save" />
</p>
</fieldset>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}