我想知道如何为派生模型生成控制器。让我给你一张大图。有一个Man类,从中继承了User类。正如我在几个 EF 教程中所读到的,我没有在 DatabaseContext 类中定义 DbSet。因此,您可能知道在 SQL 上只会生成一个表,其中包含除鉴别器列之外的Man 和 User类的所有属性。
当我试图为 User 找出一个 Controller 类时,问题就出现了,但由于 DatabaseContext 中没有提到它,MVC 无法创建它并最终出现错误。因此,我为父类Man类创建了一个 Controller 。我还在控制器中做了一些修改,以明确指向用户。我的意思是,使用 OfType<> 等。但是当我来到基于 MVC 脚手架创建的视图时,我找不到任何用户属性,那些专用于这个类的属性。
以下是 Man 类:
public class Man
{
[Key]
[DatabaseGenerated(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity)]
public long ID { get; set; }
//------------------------------------------------------------//
[Required, MaxLength(20)]
[LocalizedAttribute("FName")]
public string FName { get; set; }
//------------------------------------------------------------//
[Required, MaxLength(20)]
[LocalizedAttribute("LastName")]
public string LastName { get; set; }
//------------------------------------------------------------//
[Required]
[RegularExpression("^[0-9]+$", ErrorMessageResourceName = "ErrorOnlyNumbers", ErrorMessageResourceType = typeof(MAHAL_E_MA_Model.Properties.Resources))]
[LocalizedAttribute("Mobile")]
public string Mobile { get; set; }
//------------------------------------------------------------//
[LocalizedAttribute("Phone")]
[RegularExpression("^[0-9]+$", ErrorMessageResourceName = "ErrorOnlyNumbers", ErrorMessageResourceType = typeof(MAHAL_E_MA_Model.Properties.Resources))]
public string HomePhone { get; set; }
//------------------------------------------------------------//
[RegularExpression("^[0-9]+$")]
[LocalizedAttribute("IDCardNumber")]
public string IDCardNumber { get; set; }
//------------------------------------------------------------//
[RegularExpression("^[0-9]+$")]
[LocalizedAttribute("NationalCode")]
public string NationalCode { get; set; }
//------------------------------------------------------------//
[MaxLength(10)]
[LocalizedAttribute("DOB")]
public int DOB { get; set; }
//------------------------------------------------------------//
[Required]
public int CityID { get; set; }
[ForeignKey("CityID")]
public virtual City CityParent { get; set; }
//------------------------------------------------------------//
[MaxLength(100)]
[LocalizedAttribute("Address")]
public string Address { get; set; }
//------------------------------------------------------------//
[LocalizedAttribute("PostalCode")]
public string PostalCode { get; set; }
//------------------------------------------------------------//
[MaxLength(255)]
[LocalizedAttribute("PhotoPath")]
public string PhotoPath { get; set; }
}
这里是用户类:
public class User : Man
{
[MaxLength(20)]
[LocalizedAttribute("Username")]
public string UserName { get; set; }
//------------------------------------------------------------//
[DataType(DataType.Password)]
[MaxLength(100), MinLength(6, ErrorMessageResourceType = typeof(MAHAL_E_MA_Model.Properties.Resources), ErrorMessageResourceName = "ErrorPasswordLength")]
[LocalizedAttribute("Password")]
public string Password { get; set; }
//------------------------------------------------------------//
[DataType(DataType.Password)]
[Compare("Password", ErrorMessageResourceType = typeof(MAHAL_E_MA_Model.Properties.Resources), ErrorMessageResourceName = "ErrorConfirmPassword")]
[LocalizedAttribute("ConfirmPassword")]
public string ConfirmPassword { get; set; }
//------------------------------------------------------------//
[DataType(DataType.EmailAddress, ErrorMessageResourceType = typeof(MAHAL_E_MA_Model.Properties.Resources), ErrorMessageResourceName = "ErrorEmailInvalid")]
[MaxLength(20)]
[RegularExpression(@"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}")]
[LocalizedAttribute("Email")]
public string Email { get; set; }
//------------------------------------------------------------//
[MaxLength(30)]
[LocalizedAttribute("Title")]
public string Title { get; set; }
//------------------------------------------------------------//
[MaxLength(10)]
[LocalizedAttribute("HireDate")]
public int HireDate { get; set; }
//------------------------------------------------------------//
[LocalizedAttribute("ReportsTo")]
public long ReportsTo { get; set; }
[ForeignKey("ReportsTo")]
public virtual IList<User> ReportsChild { get; set; }
}
此外,我确实在我的控制器中使用了 OfType 并这样查看:
//
// GET: /User/
public ViewResult Index()
{
//var mans = db.Mans.Include(m => m.CityParent);
return View(unitOfWork.UserRepository.Get(orderBy: us => us.OrderByDescending(u => u.ID)).OfType<User>().ToList());
}
// POST: /User/Create
[HttpPost]
public ActionResult Create(Man man)
{
if (ModelState.IsValid)
{
//db.Mans.Add(man);
//db.SaveChanges();
MAHAL_E_MA_Model.POCO.User user = (MAHAL_E_MA_Model.POCO.User)man;
unitOfWork.UserRepository.InsertData(user);
unitOfWork.UserRepository.Save();
return RedirectToAction("Index");
}
// ViewBag.CityID = new SelectList(db.Cities, "CityID", "Name", man.CityID);
return View(man);
}
在视图中:
@foreach (var item in Model)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.FName.OfType<MAHAL_E_MA_Model.POCO.User>())
</td>
<td>
@Html.DisplayFor(modelItem => item.LastName.OfType<MAHAL_E_MA_Model.POCO.User>())
</td>
<td>
@Html.DisplayFor(modelItem => item.Mobile.OfType<MAHAL_E_MA_Model.POCO.User>())
</td>
<td>
@Html.DisplayFor(modelItem => item.HomePhone.OfType<MAHAL_E_MA_Model.POCO.User>())
</td>
<td>
@Html.DisplayFor(modelItem => item.IDCardNumber.OfType<MAHAL_E_MA_Model.POCO.User>())
</td>
<td>
@Html.DisplayFor(modelItem => item.NationalCode.OfType<MAHAL_E_MA_Model.POCO.User>())
</td>
<td>
@Html.DisplayFor(modelItem => item.DOB)
</td>
<td>
@Html.DisplayFor(modelItem => item.CityParent.Name.OfType<MAHAL_E_MA_Model.POCO.User>())
</td>
<td>
@Html.DisplayFor(modelItem => item.Address.OfType<MAHAL_E_MA_Model.POCO.User>())
</td>
<td>
@Html.DisplayFor(modelItem => item.PostalCode.OfType<MAHAL_E_MA_Model.POCO.User>())
</td>
<td>
@Html.DisplayFor(modelItem => item.PhotoPath.OfType<MAHAL_E_MA_Model.POCO.User>())
</td>
<td>
@Html.ActionLink(GeneralResource.Edit, "Edit", new { id = item.ID }) |
@Html.ActionLink(GeneralResource.ViewDetails, "Details", new { id = item.ID }) |
@Html.ActionLink(GeneralResource.Delete, "Delete", new { id = item.ID })
</td>
</tr>
顺便说一句,我从来没有提到过DbSet<User>
while 提到的DbSet<Man>
. 原因; EF 将创建一张表,其中包含 User 和 Man 的所有属性,称为 Man 表。可以使用 Discriminator 列区分不同的继承类,例如 Customer(本问题中未提及)和 User。
对不起,如果故事变得很长,但是我该如何处理呢?也就是说,我怎样才能在视图中拥有用户属性?我是否必须将它们添加到自己身上,但如果是这样,我将无法访问它们,因为会分散一些 DisplayFor() 包含在创建数据输入表单的 foreeach 循环中。
希望我能成功转移问题..有人可以帮我吗?问候,