HttpGet 和 HttpPost 返回验证错误并加载 SelectList



>我有一个基于 ViewModel 的表单,该表单提示用户将人员的XApplication状态更改为"已接受"或"已拒绝"。

当我通过 POST 提交表单时,我想创建一个新XApplication,如果成功,则将用户带回同一页面。如果它包含错误,那么我希望通过传递 View(personApp) 再次重新加载表单,这将通过 razor 方法@Html.ValidationSummary()显示错误。

但是,当我尝试这样做时,View(( 不知道我的选择列表,并且无法用"应用程序已接受"和"应用程序被拒绝"填充下拉列表。

我可以采取其他方法吗?

[Route("student/xApplication/{personId?}")]
[HttpGet]
public ActionResult xApplication(int? personId)
{
    if (personId == null)
    {
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    }
    Person person = db.People.Find(personId);
    if (person == null)
    {
        return HttpNotFound();
    }
    // Prepare ViewModel to pass to view, based on personId
    PersonViewModel personVModel = new PersonViewModel();
    personVModel.Person = person;
    // Get XApplication Data
    var xApps = from a in db.XApplications where a.personId == personId select a;
    XApplication personXApplication = null;
    if (xApps.Count() > 0)
    {
        personXApplication = xApps.First();
    }
    personVModel.XApplications = personXApplication;
    List<SelectListItem> applicationStatusItems = new List<SelectListItem>();
    applicationStatusItems.Add(new SelectListItem { Value = "1", Text = "Application Accepted" });
    applicationStatusItems.Add(new SelectListItem { Value = "0", Text = "Application Rejected" });
    SelectList applicationStatusList = new SelectList(applicationStatusItems, "Value", "Text", null);
    personVModel.ApplicationStatusList = applicationStatusList;
    return View(personVModel);
}
[HttpPost]
[Route("student/xApplication")]
public ActionResult xApplication(PersonViewModel personVModel)
{
    if (ModelState.IsValid)// Checks no errors
    {
        db.XApplications.Add(personVModel.XApplications);
        db.SaveChanges();
        return Redirect("/student/xApplication/" + personVModel.Person.id);
    }
    return View(personVModel);
}

由于SelectList是硬编码的,我建议在PersonViewModel内部生成它们以避免代码重复。为此,可以将生成SelectList的代码移动到名为 PopulateApplicationStatusList 的公共方法,并在构造函数中调用它

public class PersonViewModel
{
    public PersonViewModel()
    {
        this.PopulateApplicationStatusList();
    }
    public SelectList ApplicationStatusList { get; set; }
    public void PopulateApplicationStatusList()
    {
        List<SelectListItem> applicationStatusItems = new List<SelectListItem>();
        applicationStatusItems.Add(new SelectListItem { Value = "1", Text = "Application Accepted" });
        applicationStatusItems.Add(new SelectListItem { Value = "0", Text = "Application Rejected" });
        this.ApplicationStatusList = new SelectList(applicationStatusItems, "Value", "Text", null);
    }
}

在 get 操作方法中,当您创建新的 PersonViewModel 实例时,将生成ApplicationStatusList

[Route("student/xApplication/{personId?}")]
[HttpGet]
public ActionResult xApplication(int? personId)
{
    if (personId == null)
    {
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    }
    Person person = db.People.Find(personId);
    if (person == null)
    {
        return HttpNotFound();
    }
    // Prepare ViewModel to pass to view, based on personId
    PersonViewModel personVModel = new PersonViewModel(); // ApplicationStatusList is generated here
    personVModel.Person = person;
    // Get XApplication Data
    var xApps = from a in db.XApplications where a.personId == personId select a;
    XApplication personXApplication = null;
    if (xApps.Count() > 0)
    {
        personXApplication = xApps.First();
    }
    personVModel.XApplications = personXApplication;
    return View(personVModel);
}

在 post action 方法中,可以通过调用PopulateApplicationStatusList方法ApplicationStatusList出现任何错误时重新填充属性

[HttpPost]
[Route("student/xApplication")]
public ActionResult xApplication(PersonViewModel personVModel)
{
    if (ModelState.IsValid)// Checks no errors
    {
        db.XApplications.Add(personVModel.XApplications);
        db.SaveChanges();
        return Redirect("/student/xApplication/" + personVModel.Person.id);
    }
    // repopulate ApplicationStatusList property
    personVModel.PopulateApplicationStatusList();
    return View(personVModel);
}

最新更新