如何在控制器上发布模型列表
本文关键字:模型 列表 布模型 控制器 | 更新日期: 2023-09-27 18:16:29
有一张表格,我将询问学术详细信息:
- 毕业
- 毕业后(硕士)
- 职业资格。
到目前为止,任何用户说UserId="1" 将在我的AcademicMaster中创建3个条目,分别为学士,硕士(毕业后)和专业资格。
My Database AcademicMaster表字段和数据模型:
Id,Qualification(GraduationCourses),Acheievement,UserId
视图模型:
public class AcademicViewModel
{
public int Id { get; set; }
public virtual Graduation Graduation{ get; set; }
public virtual PostGraduation PostGraduation{ get; set; }
public virtual ProfessionalQualification ProfessionalQualification{ get; set; }
}
public class Graduation
{
public string BachelorQualification { get; set; }
public string BachelorAchievement { get; set; }
}
public class PostGraduation
{
public string MasterQualification { get; set; }
public string MasterAchievement { get; set; }
}
public class ProfessionalQualification
{
public string ProfessionalQualifications { get; set; }
}
所以我的视图是这样的:
@model AcademicViewModel
@{
IEnumerable<SelectListItem> graduationList = ViewBag.GraduationList;
IEnumerable<SelectListItem> postGraduationList = ViewBag.PostGraduationList;
}
@using (Html.BeginForm())
{
<div class="row">
Bachelors
@Html.DropDownListFor(model => model.Graduation.Qualification, graduationList)
</div>
@Html.TextAreaFor(model => model.Graduation.Achievement)
<div class="row">
MASTERS
@Html.DropDownListFor(model => model.PostGraduation.Qualification, postGraduationList)
</div>
@Html.TextAreaFor(model => model.PostGraduation.Achievement)
<div class="row">
PROFESSIONAL QUALIFITCATION
@Html.TextAreaFor(model => model.ProfessionalQualification.ProfessionalQualifications)
</div>
<input type="submit" value="Save">
}
这是我的控制器:
[HttpPost]
public ActionResult MyController(AcademicViewModel model)
{
//Actions
}
所以我的视图模型结构是否合适,以及如何在AcademicMaster表中创建3个条目??
我首先要说的是,拥有一个表可能不是最好的选择(如果以后你开始添加可能适用于Graduation
而不适用于Professional
的附加属性会发生什么-例如YearOfGraduation
-你可能最终会有大量的字段,其中许多可能具有null
值。
但是,如果您想要一个表,那么至少添加另一个字段,以便您可以识别数据是否与Graduation
, PostGraduation
或Professional
相关。AcademicMasters
表的关联数据模型为
public class AcademicMaster
{
public int ID { get; set; }
public string Type { get; set; } // may be an enum?
public string Qualification { get; set; }
public string Achievement { get; set; }
public int UserID { get; set; }
}
旁注:使用enum
作为Type
属性可能会更好
public enum AcademicType
{
Graduation,
PostGraduation,
Professional
}
似乎没有任何需要你当前的Graduation
, PostGraduation
和ProfessionalQualification
模型,你的视图模型应该是
public class AcademicViewModel
{
public string GraduationQualification { get; set; }
public string GraduationAchievement { get; set; }
public string PostGraduationQualification { get; set; }
public string PostGraduationAchievement { get; set; }
public string ProfessionalAchievement { get; set; }
public IEnumerable<SelectListItem> GraduationList { get; set; }
public IEnumerable<SelectListItem> PostGraduationList { get; set; }
}
旁注:目前尚不清楚您当前的ProfessionalQualifications
属性是什么-是否分配给Qualification
字段或数据库中的Acheievement
字段?既然您使用的是视图模型,那么它应该包含SelectList
而不是使用ViewBag
。
那么你的视图将是
@model AcademicViewModel
@using (Html.BeginForm())
{
<h2>Graduation</h2>
@Html.DropDownListFor(m => m.GraduationQualification, Model.GraduationList)
@Html.TextAreaFor(m => m.GraduationAchievement)
... // repeat for PostGraduation and Professional
<input type="submit" value="Save">
}
POST方法是
[HttpPost]
public ActionResult MyController(AcademicViewModel model) // should be named Create?
{
var userID = ....
AcademicMaster graduation = new AcademicMaster
{
Type = AcademicType.Graduation,
Qualification = model.GraduationAchievement,
Achievement = model.GraduationAchievement,
UserId = userID;
};
db.AcademicMasters.Add(graduation);
// Repeat for PostGraduation and Professional
db.SaveChanges();
// redirect?
}