更新可能なコンテンツを含むビューからの複雑なモデルのバインドに問題があります。まず最初に、次のことを行います。
public partial class Diagnosis
{
public Diagnosis()
{
this.DiagZones = new HashSet<DiagZone>();
...
}
public int diagnosisid { get; set; }
public int playerid { get; set; }
public int userid { get; set; }
...
public virtual ICollection<DiagZone> DiagZones { get; set; }
}
私のコレクションはとDiagZones
の間の中間テーブルですが、モデルに存在します。原因にはIDよりも多くのフィールドがあります。Diagnosis
Zones
Zones
選択コントロールがあり、起動時にonchange
ajax呼び出しで部分ビューを選択および選択解除できます。
コード:
EditDiagnosis.cshtml
@model Gfire.Models.DiagnosisViewModel
<h2>
@ViewBag.playername</h2>
@using (Html.BeginForm("EditDiagnosis", "Diagnosis", FormMethod.Post))
{
@Html.HiddenFor(d => d.Diagnosis.diagnosisid)
<table>
...
</table>
<table>
<tr>
<td>
Zones:
</td>
<td>
@Html.ListBoxFor(d => d.SelectedZones, new SelectList(Model.Zones, "zoneid", "description"), new
{
style = "width:305px;",
onchange = "QualityMovement(this);",
id = "lbZone",
@class = "chzn-select"
})
</td>
<td>
...
</td>
</tr>
</table>
<div id="qualitymovement">
@Html.Partial("_QualityMovement", Model.Diagnosis.DiagZones)
</div>
<div>
<input type="submit" value="Save" />
  |   @Html.ActionLink("Cancel", "IndexDiagnosisPlayer", new { playerid = ViewBag.playerid })
</div>
}
部分ビュー(_QualityMovement.cshtml):
@model List<Gfire.Domain.Entities.Diagnosis.DiagZone>
@if (Model.Count() != 0)
{
<table>
@foreach (var dz in Model)
{
<tr>
<tr>
<td>
Flex:
</td>
<td>
@Html.TextBoxFor(d => dz.flex))
</td>
</tr>
</tr>
}
</table>
}
Ajax.Get
呼び出し:
<script type="text/javascript" language="javascript">
function JointBalance(item) {
...
$.ajax({
url: '@Url.Action("GetJointBalances", "Diagnosis")',
data: arrayToParamObject('zonesid', items),
contentType: "application/json; charset=utf-8",
success: function (data) {
// Successful requests get here
$("#jointbalance").html(data);
$("#jointbalance").fadeIn('slow');
},
type: "GET",
datatype: "json"
});
...
}
</script>
サーバーには、の新しいリストを初期化し、をDiagZones
正しく更新するメソッドがありますEditView.cshtml
。
問題は、Diagnosis
すべてのフィールドとDiagZonesのリストを含む完全なオブジェクトを送信しようとしたときに発生しますが、私のメソッドは次のとおりです。
[HttpPost]
public ActionResult EditDiagnosis(DiagnosisViewModel DiagnosisViewModel)
{
if (ModelState.IsValid)
{
// Save the model
...
return RedirectToAction("IndexDiagnosisPlayer", new { playerid = SessionHelper.Player.playerid });
}
else
{
return View("EditDiagnosis", new { diagnosisid = DiagnosisViewModel.diagnosisid });
}
}
私のモデルはDiagnosisViewModel.DiagZones
リストを空にしました。
EditorForを使用して、モデル全体を部分ビューに渡し、いくつかのフォームを追加しようとしましたが、役に立たなかったのですが、そのリストをモデルにバインドするにはどうすればよいですか?
前もって感謝します。
アップデート
サーバー側のアクションが期待していることは次のとおりです。
[HttpGet]
public ActionResult GetJointBalances(int[] zonesid) { ... }
GETajaxリクエストデータは次のようになります。
Request URL:http://localhost/Gfire.WebUI/Diagnosis/GetQualityMovement?zonesid=47
Request Method:GET
Status Code:200 OK
Request Headersview source
...
Connection:keep-alive
Content-Type:application/json; charset=utf-8
...
Referer:http://localhost/Gfire.WebUI/Diagnosis/EditDiagnosis?diagnosisid=0&playerid=23
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.152 Safari/537.22
X-Requested-With:XMLHttpRequest
Query String Parametersview sourceview URL encoded
zonesid:47