2

可能这个问题的解决方法应该是简单的,但我不能找到最新的错误,为了让读者理解,我必须解释我的情况。该视图没有将正确的信息传递给控制器​​

我有一个名为位置级别,另一个申请人,另一个ApplicantPosition,另一种状态和ApplicantPositionHistory

阶级地位持有类似职位名称基本信息:例如:.NET开发人员。 申请人拥有姓名,名字等基本信息。 ApplicantPosition类保存关系,上次修改日期和CURRENTSTATUS。 ApplicantPositionHistory类具有2个对名为newStatus和oldStatus的状态的引用。

public class ApplicationPositionHistory 
{ 


    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
public int ApplicationPositionHistoryID { get; set; } 

[ForeignKey("ApplicantPositionID")] 
public ApplicantPosition ApplicantPosition { get; set; } 

[Column("ApplicantPositionID")] 
public int ApplicantPositionID { get; set; } 

[Column("OldStatusID")] 
public int OldStatusID { get; set; } 

[Column("NewStatusID")] 
public int NewStatusID { get; set; } 

[ForeignKey("OldStatusID")] 
public Status OldStatus { get; set; } 

[ForeignKey("NewStatusID")] 
public Status NewStatus { get; set; } 

[StringLength(500, MinimumLength = 3, ErrorMessage = "Comments should not be longer than 500 characters.")] 
[Display(Name = "Comments")] 
public string Comments { get; set; } 

[DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)] 
[Display(Name = "Date")] 
public DateTime DateModified { get; set; } 
} 

在我的前端,我有一个屏幕,显示已在在他们创造ApplicantPositionHistory的实体画面应用到位置

name position   actions 
andew .net developer  view history 

When they click on history they see: 
old status  new status  comments   datemodified 
new   applied   new prospect 
applied  approved by hr approved by hr 

问题的申请人。 我想使用最后一行中的newStatus作为oldstatus,而newstatus应该是用户选择的那个。 (这是整个问题的关键)

在下面的代码中,newStatus和OldStatus总是指向相同的ID。因此,插入工作,但它始终使用相同的ID,并没有显示申请人的状态历史的真实跟踪。

这是HTML

<table>  
    <tr> 
     <th> 
      Previous Status 
     </th> 
    </tr> 
    <tr> 
     <td> 
      @Html.Label(ViewData["oldStatus"].ToString()) 
     </td> 
    </tr> 
</table> 

@using (Html.BeginForm()) { 
    @Html.ValidationSummary(true) 
    <fieldset> 
     <legend>ApplicationPositionHistory</legend>  
     <div class="editor-label"> 
      New Status 
     </div> 
     <div class="editor-field"> 
      @Html.DropDownList("NewStatusID", (IEnumerable<SelectListItem>)ViewBag.Statuses) 
      @Html.ValidationMessageFor(model => model.NewStatusID) 
     </div> 
     <div class="editor-label"> 
      @Html.LabelFor(model => model.Comments) 
     </div> 
     <div class="editor-field"> 
      @Html.TextAreaFor(model => model.Comments) 
      @Html.ValidationMessageFor(model => model.Comments) 
     </div> 
     <p> 
      <input type="submit" value="Create" /> 
     </p> 
    </fieldset> 
} 

这是控制器动作

[HttpPost] 
     public ActionResult Create(ApplicationPositionHistory applicationpositionhistory) 
     { 
      applicationpositionhistory.DateModified = DateTime.Now; 

      if (ModelState.IsValid) 
      { 
       applicationpositionhistory.OldStatusID = applicationpositionhistory.NewStatusID; 
       applicationpositionhistory.OldStatus = 
        _unitOfWork.StatusRepository.GetStatusById(applicationpositionhistory.NewStatusID); 

       _unitOfWork.ApplicantPositionHistoryRepository.InsertApplicationPositionHistory(applicationpositionhistory); 
       _unitOfWork.Save(); 
       return RedirectToAction("History", new { applicantPositionID = ViewData["applicantPositionId"] }); 
      } 

      ViewBag.oldStatusID = new SelectList(_unitOfWork.StatusRepository.GetAllStatus(), "StatusID", "status", applicationpositionhistory.OldStatusID); 
      ViewBag.newStatusID = new SelectList(_unitOfWork.StatusRepository.GetAllStatus(), "StatusID", "status", applicationpositionhistory.NewStatusID); 
      return View(applicationpositionhistory); 
     } 

回答

3

如果我明白你的问题......两个选项可能是:

1)创建一个隐藏的字段的形式具有OldStatus的值。你可以在HttpGet action的model/viewModel中设置它。因此,当表单发布时,OldStatus将被绑定。

2-)在创建[HttpPost]操作的控制器,而不是:在你的数据存储/服务

applicationpositionhistory.OldStatusID = applicationpositionhistory.NewStatusID; 

查找什么最新的状态是和设置。我认为这会更好,因为您不必担心可以修改隐藏字段的高级用户。

在附注上,我会考虑创建一个封装了这个逻辑的域类,而不是让控制器担心它。

HTH ...

3

ViewData仅在该请求期间存在。它不包括请求。

处理此问题的一种方法是使用HiddenFor()帮助程序。这将允许您创建一个隐藏的字段,您可以在下一篇文章中阅读您的文章OldStatusID

相关问题