如何在控制器上发布模型列表

本文关键字:模型 列表 布模型 控制器 | 更新日期: 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, PostGraduationProfessional相关。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, PostGraduationProfessionalQualification模型,你的视图模型应该是

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?
}