View未将正确的信息传递给控制器

时间:2011-10-31 15:47:37

标签: asp.net-mvc asp.net-mvc-3 entity-framework entity-framework-4 entity-framework-4.1

可能解决这个问题应该是简单的,但我不能发现什么是错的,我必须解释我的情景,以便读者理解。

我有一个名为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);
        }

2 个答案:

答案 0 :(得分:3)

如果我理解你的问题......有两种选择:

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

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

applicationpositionhistory.OldStatusID = applicationpositionhistory.NewStatusID;

在数据存储区/服务中查找最新状态并设置它。我认为这样会更好,因为您不必担心可以修改隐藏字段的高级用户。

另外,我会考虑创建一个封装此逻辑的域类,而不是让控制器担心它。

... HTH

答案 1 :(得分:3)

ViewData仅在该请求期间存在。它不会跨越请求。

处理此问题的一种方法是使用HiddenFor()助手。这样您就可以使用OldStatusID创建一个隐藏字段,您可以在下一篇文章中阅读该字段。