場景: 我有一個從ViewModel填充行的表。每行都有複選框,允許用戶檢查一個或多個行,然後從下拉菜單中選擇操作來編輯所選行的屬性。模型在郵政上沒有正確提交/綁定
一切工作正常到這一點,我可以讓ViewModel正確傳遞,然後使用它和它的所有屬性在一個POST操作方法。我可以根據用戶選擇的選項進行更改。
但是,由於下拉菜單中的某些選項會導致相當大的且不可逆轉的更改,因此我正在使用GET調用新視圖並僅填充所選行填充新表,並要求用戶確認他們想要做出改變。到目前爲止,一切都還好。新視圖按照預期方式填充,只有在前一個視圖中選擇的行。
問題: 在用戶確認他們的意圖後,使用POST調用Action方法。正確填充當前視圖的ViewModel正確地進入控制器。我得到ViewModel,但不具有與填充視圖相同的屬性。
視圖模型
public class ProjectIndexViewModel
{
public List<ProjectDetailsViewModel> Projects { get; set; }
public string FlagFormEditProjects { get; set; }
public string FlagFormNewProjectStatus { get; set; }
}
的List<ProjectDetailsViewModel> Projects
是什麼是用於填充表格的行和項目什麼都沒有正確地在控制器中的POST操作方法結合。
初始視圖選中複選框的位置。請注意當選擇其中一個下拉選項時調用的JavaScript函數之一的示例,這是提交表單的原因。
@using (Html.BeginForm("EditProjectsTable", "Project", FormMethod.Get, new { name = "formEditProjects", id = "formEditProjects" }))
{
@Html.HiddenFor(item => item.FlagFormEditProjects)
@Html.HiddenFor(item => item.FlagFormNewProjectStatus)
....
<table>
<thead>
....
</thead>
<tbody>
@for (int i = 0; i < Model.Projects.Count; i++)
{
<tr>
<td>@Html.DisplayFor(x => x.Projects[i].ProjectNumber)</td>
<td>@Html.DisplayFor(x => x.Projects[i].ProjectWorkType)</td>
.... // more display properties
<td>
@Html.CheckBoxFor(x => x.Projects[i].Selected, new { @class = "big-checkbox" })
@Html.HiddenFor(x => x.Projects[i].ProjectModelId)
</td>
</tr>
}
</tbody>
</table>
}
function submitFormRemoveProjects() {
$("#FlagFormEditProjects").attr({
"value": "RemoveProjects"
});
$('#formEditProjects').submit();
}
返回「確認」查看操作方法(正常工作)
[HttpGet]
[Authorize(Roles = "Sys Admin, Account Admin, User")]
public async Task<ActionResult> EditProjectsTable([Bind(Include = "Projects,FlagFormEditProjects,FlagformNewProjectStatus")]ProjectIndexViewModel projectIndexViewModel)
{
// Repopulate the Projects collection of ProjectIndexViewModel to
// include only those that have been selected
return View(projectIndexViewModel);
}
是從操作方法返回上面的視圖(正常工作)注意,操作方法得到所調用的是在Html.BeginForm調用中使用actionName變量動態設置的。
@using (Html.BeginForm(actionName, "Project", FormMethod.Post))
{
@Html.AntiForgeryToken()
@Html.HiddenFor(model => model.FlagFormNewProjectStatus)
....
<table>
<thead>
....
</thead>
<tbody>
@for (int i = 0; i < Model.Projects.Count; i++)
{
<tr>
<td>@Html.HiddenFor(x => x.Projects[i].ProjectModelId)</td>
<td>@Html.DisplayFor(x => x.Projects[i].ProjectNumber)</td>
<td>@Html.DisplayFor(x => x.Projects[i].ProjectWorkType)</td>
.... // more display properties
</tr>
}
</tbody>
</table>
<input type="submit" value="Delete Permanently" />
}
的是從該視圖稱爲控制器操作方法之一的一個例子,並且不具有相同的項目,這是在視圖中。不知何故,它有最初選擇的項目數量相同,但如果只選擇了一個,則它具有最低模型ID的項目。我不知道如何描述發生了什麼。但是總之,正確的ViewModel並沒有進入下面所示的POST方法示例。
[HttpPost]
[ValidateAntiForgeryToken]
[Authorize(Roles = "Sys Admin, Account Admin")]
public async Task<ActionResult> DeleteConfirmedMultipleProjects([Bind(Include = "Projects")] ProjectIndexViewModel projectIndexViewModel)
{
if (ModelState.IsValid)
{
// Remove Projects from db and save changes
return RedirectToAction("../Project/Index");
}
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
請幫忙!
牆上的代碼!你只能發佈***最低可行性代碼***? – Win
對不起,我把它清理了一下。 – amartin
你是什麼意思,「我得到的ViewModel,但不是與填充視圖相同的屬性。」以及「DeleteConfirmedMultipleProjects」方法中的預期數據是什麼? –