可能解决这个问题应该是简单的,但我不能发现什么是错的,我必须解释我的情景,以便读者理解。
我有一个名为Position的课程,另一个申请人,另一个申请人职位,另一个身份和申请人职位历史
类Position保存基本信息,如位置名称:例如:.net developer。 申请人类持有姓名,名字等基本信息。 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; }
}
在我的前端,我有一个屏幕,显示已申请职位的申请人
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
屏幕中创建ApplicantPositionHistory实体的问题。 我想使用最后一行的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);
}
答案 0 :(得分:3)
如果我理解你的问题......有两种选择:
1-)在具有OldStatus值的表单中创建一个隐藏字段。您可以在HttpGet操作中的model / viewModel中设置它。因此,当发布表单时,OldStatus将被绑定。
2-)在Create [HttpPost]动作的控制器中,而不是:
applicationpositionhistory.OldStatusID = applicationpositionhistory.NewStatusID;
在数据存储区/服务中查找最新状态并设置它。我认为这样会更好,因为您不必担心可以修改隐藏字段的高级用户。
另外,我会考虑创建一个封装此逻辑的域类,而不是让控制器担心它。
... HTH
答案 1 :(得分:3)
ViewData仅在该请求期间存在。它不会跨越请求。
处理此问题的一种方法是使用HiddenFor()
助手。这样您就可以使用OldStatusID
创建一个隐藏字段,您可以在下一篇文章中阅读该字段。