可能的解决方法应该很简单,但是我找不到什么错误,因此我必须解释一下自己的情况,以便读者理解。

我有一个名为职位的类,另一个申请人,另一个ApplicantPosition,另一个Status和ApplicantPositionHistory

Position类保存诸如位置名称之类的基本信息:例如:.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; }
}

在我的前端,有一个屏幕显示已申请职位的申请人
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);
        }

最佳答案

如果我理解您的问题...两个选择可能是:

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

2-)在控制器中的Create [HttpPost]操作中,而不是:

applicationpositionhistory.OldStatusID = applicationpositionhistory.NewStatusID;

在您的数据存储/服务中查找最新状态,然后进行设置。我认为这是可取的,因为您不必担心可以修改隐藏字段的高级用户。

附带说明一下,我将考虑创建一个封装该逻辑的域类,而不必让控制器担心它。

HTH ...

07-24 20:01