View не передает правильную информацию контроллеру - PullRequest
2 голосов
/ 31 октября 2011

Возможно, это должно быть что-то простое, но я просто не могу найти, что не так, и мне нужно объяснить свой сценарий, чтобы читатели могли понять.

У меня есть класс под названием 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 всегда указывают на один и тот же идентификатор. Таким образом, вставка работает, но всегда использует один и тот же идентификатор и не показывает реального отслеживания истории статусов заявителя.

Это 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 ]

3 голосов
/ 31 октября 2011

ViewData существует только во время этого запроса.Это не охватывает запросы.

Один из способов справиться с этим - использовать помощник HiddenFor().Это позволит вам создать скрытое поле с OldStatusID, которое вы можете прочитать в следующем посте.

3 голосов
/ 31 октября 2011

Если я понял ваш вопрос ... два варианта могут быть:

1-) Создать скрытое поле в форме, которое имеет значение OldStatus.Вы должны установить это в model / viewModel в действии HttpGet.Таким образом, когда форма публикуется, OldStatus будет связан.

2-) В контроллере в действии Create [HttpPost] вместо:

applicationpositionhistory.OldStatusID = applicationpositionhistory.NewStatusID;

Lookup в вашем хранилище данных /сервис, какой самый последний статус и установить его.Я думаю, что это было бы предпочтительнее, так как вам не придется беспокоиться о опытных пользователях, которые могут изменить ваше скрытое поле.

Кстати, я бы подумал о создании класса домена, который инкапсулирует эту логику, а не с контроллеромнужно беспокоиться об этом.

HTH ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...