2014-09-26 48 views
0

我有一个基于ViewModel的表单,它提示用户将Person的XApplication状态更改为Accepted或Rejected。HttpGet和HttpPost返回验证错误并加载SelectList

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

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

我可以采取另一种方法吗?

[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); 
} 
+1

你可以做的是让视图模型自己照顾selectlistitem。因此,您不必重新填充控制器中的项目。 – Jamie 2014-09-26 14:50:36

+0

我会给那一个去杰米,是有道理的。 – 2014-09-26 15:07:14

回答

1

由于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); 
    } 
} 

在你取得动作的方法,ApplicationStatusList将产生当您创建的PersonViewModel

一个新实例
[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); 
} 

在您的文章操作方法,你可以重新填充ApplicationStatusList财产通过调用PopulateApplicationStatusList方法

,当有任何错误
相关问题