【问题标题】:MVC 3 - Entity Framework - Post data from ajax-invoked Partial ViewMVC 3 - 实体框架 - 从 ajax 调用的部分视图发布数据
【发布时间】: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 集合是 DiagnosisZones 之间的中间表,但它存在于我的模型中,因为它的字段比 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" />
        &nbsp | &nbsp @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


【解决方案1】:

我找到了一个暂时的解决方案,当然不是最好的,但我认为这将有助于理解我想要做什么以及如何解决这个问题。 正如贾斯汀所说,问题在于将list&lt;DiagZones&gt; 绑定到主模型Diagnosis 对象,遵循以下帖子:

我了解一点绑定功能,考虑到这一点,我编写了新的 PartialView _QualityMovement.cshtml

@模型列表

@if (Model.Count() != 0)
{
    <table>
        @foreach (var dz in Model)
        {
            <tr>
                <tr>
                    <td>
                        Flex:
                    </td>
                    <td>
                        Html.TextBox("Diagnosis.DiagZones[" + i + "].ext", Model[i].ext)
                    </td>
                </tr>
            </tr>


        }
    </table>
}

这是一个糟糕的解决方案,但至少我将模型绑定在服务器端。 问题是实体框架对我的实体进行了抽象,作为 ICollection,所以我不能作为 List 进行迭代,发现自己到处都在“强制转换”。

我认为更好的方法应该是使用 CustomBinder 来检索请求中的数据或以更简洁易懂的方式键入数据。

感谢Justin您给我的所有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-12
    • 2012-12-27
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    • 2014-05-25
    • 1970-01-01
    相关资源
    最近更新 更多