0

更新可能なコンテンツを含むビューからの複雑なモデルのバインドに問題があります。まず最初に、次のことを行います。

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よりも多くのフィールドがあります。DiagnosisZones

Zones選択コントロールがあり、起動時にonchangeajax呼び出しで部分ビューを選択および選択解除できます。

コード:

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

問題は、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
4

1 に答える 1

0

私は一時的な解決策を見つけましたが、もちろん最善ではありませんが、私がやろうとしていたこととこれを解決する方法を理解するのに役立つと思います。ジャスティンが言ったように、問題はこれの投稿に従って、list<DiagZones>メインモデルであるオブジェクトにバインドすることでした: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としてエンティティに抽象化されているため、リストとして繰り返すことができず、どこにでも「キャスト」していることに気づきました。

より良いアプローチは、リクエスト内のデータを取得するか、きちんと理解できる方法でデータを入力するためのCustomBinderであるべきだと思います。

Justinあなたが私にくれたすべての助けに感謝します。

于 2013-03-09T13:32:10.970 に答える