【发布时间】:2013-03-08 12:56:41
【问题描述】:
我在从具有可更新内容的视图绑定复杂模型时遇到问题,首先是实体:
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 集合是 Diagnosis 和 Zones 之间的中间表,但它存在于我的模型中,因为它的字段比 id 的多。
我有一个 Select 控件,您可以在其中选择和取消选择 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。
当我尝试提交包含所有字段和 DiagZones 列表的完整 Diagnosis 对象时出现问题,但我的方法是:
[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) { ... }
GET ajax 请求数据如下:
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
【问题讨论】:
-
您可以通过 POST 尝试吗?另外,你能显示来自
arrayToParamObject的结果JSON吗? -
我不知道您所说的“通过 POST”是什么意思,
arrayToParamObject的代码只是一个用于解析结果的 javascript 函数并且可以正常工作,这是 javascript 函数:function arrayToParamObject(名称,数组){ var obj = []; for (var i = 0, len = array.length; i -
显示正在传递给服务器的内容(即 JSON)。看起来您的方法将传递一个名称值对对象数组,而您的操作需要一个整数数组。无论哪种方式,只看到传递的实际 JSON 会容易得多。另外...“通过 POST”我的意思是,让您的 ajax 请求通过 POST 方法发送数据,这样您就可以将
type: "GET"更改为type: "POST"。在您的操作中,您会将[HttpGet]属性更改为[HttpPost]。 -
如果您不知道如何查看通过 Ajax 传递给服务器的内容...look here
-
顺便说一句 - 我会简化你的问题。真正的问题是从客户端获取数据以与服务器上的模型绑定。摆脱所有关于观点的讨论。
标签: asp.net-mvc-3 entity-framework-4 asp.net-ajax partial-views