0

この問題の解決策を長い間探しましたが、まだ何も見つかりません。使用しているコントローラー/ビューのモデルとして、強い型を定義しました。問題は、モデルが他の複雑な型を参照しているため、そのモデルのセクションを部分的に更新する必要があることです。たとえば、ページの 1 つのタブで、いくつかの選択を含むグリッドを表示する別のビューを部分的に取得します。別の部分が別のセクションをもたらします。そのため、ユーザーがオプションを選択して送信した後、それらすべての小さな断片を投稿操作に送信する必要があります。

必要な JSON オブジェクトを既に作成し、コントローラーに送信しました。アクションで、モデルを取得することに成功しましたが、JSON がアクションに来ません。では、その JSON をコントローラー アクションへの追加パラメーターとしてビューに渡すにはどうすればよいでしょうか?

私はすでにフィドラーでリクエストをチェックしており、JSONが送信されています。オブジェクトは特別なコレクションに渡されますか?


もちろん。ビューは、モデルを想定しているか、強く型付けされています。この場合は、"プロバイダー" エンティティです。このエンティティには、プリミティブ型と複合型があります。エンティティはまだ作成プロセスにあるため、作成後のアクションに達したときにエンティティを完成させるために部分オブジェクトを渡す必要があります。モデルの一部を次に示します。

public class Provider2 : IProvider
{
    public int Id { get; set; }
    public bool IsApproved { get; set; }
    public string RejectionNotes { get; set; }
    public string Name { get; set; }
    public string Phone { get; set; }
    public string Fax { get; set; }
    public string Email { get; set; }
    public int OfficeAddressId { get; set; }
    public virtual Address Address { get; set; }
    public virtual ICollection<Chain> ProviderChain { get; set; }
    public virtual ICollection<ProviderContact> ProviderContacts { get; set; }
    public virtual ICollection<ExaminationPrice> ExaminationPrices { get; set; }
}

整数や文字列などの単純な型は問題ありません。ご覧のとおり、コレクションと複雑な型があり、これらの型は部分ビューから取得され、その瞬間は別のエンティティであるため、送信時におそらく json または JSON などの別のオブジェクトでラップして取得する必要があります作成アクションに達した瞬間:

[HttpPost]
public ActionResult Create(Provider provider, Another object to be passed???)
{
    if (ModelState.IsValid)
    {
        _repository.Save(provider);
        return RedirectToAction("Index");
    }
    return View(provider);
}

プリミティブ型とアドレス プロパティはモデルでマッピングされるので問題ありませんが、コレクションはマッピングされません。そのため、json などの追加オブジェクトを渡して、プレーンな HTML からすべてのパーツをラップしようとしました。モデルに直接マップされていないため、javascript オブジェクトに。

したがって、このjavascriptによって、必要なデータをビューに送信して送信しましたが、明らかにアクションはjsonオブジェクトを受け取りません。

  $(function () {
        $("#ButtonSave").click(function () {
            var prices = getPrices();

            if (prices != null) {
                $.ajax({
                    url: '/Provider/Create',
                    type: 'POST',
                    dataType: 'json',
                    data: prices,
                    contentType: 'application/json; charset=utf-8',
                    success: function (data) {
                        alert('Success');
                    }
                });
            }
        });
    });

    function getPrices() {
        var elements = '[';        
        var rows = $("#selectedElementsGrid tr.selectable").each(function () {
            var idValue = '{price : { "Id":' + $(this).find(".id").val() + ',';
            var nameValue = ' "Name":"' + $(this).find(".name").text() + '",';
            var priceValue = ' "Price":"' + $(this).find(".price").val() + '"} },';
            elements = elements + idValue + nameValue + priceValue;
        });
        elements = elements.substring(0, elements.length - 1) + ']';
        return JSON.stringify(elements);
    }

前もって感謝します!

4

2 に答える 2

1

MVC3 フレームワークについて詳しく調べてみると、コントローラー アクションに必要な数のパラメーターを渡すことができることがわかりました。これを行うための鍵は、モデルと要求を適切に処理することです。また、これを実現する最も簡単な方法は JSON を使用することであることがわかりました。まず、必要なパラメーターを使用してコントローラー アクションを定義します。

[HttpPost]
public ActionResult AddContact(Contact contact, int Id)
{
    var globalType = _repository.FindOne(p => p.Id == Id);
    if (globalType.Contacts == null)
    {
        globalType.Contacts = new List<Contact>();
    }
    globalType.Contacts.Add(contact);
    return View("Index", globalType);
}

次に、マークアップから、パラメーターを渡す複雑な JSON を定義します。

    var contact = { Id: $('#FieldId').val(),
            Notes: $('#ContactNotes').val(),
            Name: $('#ContactName').val(),
            Phone: $('#Phone').val(),
            Fax: $('#Fax').val(),
            Email: $('#Email').val(),
            OfficeAddress: { Country: $('#Country').val(), 
                    State: $('#State').val()
                    ZipCode: $('#ZipCode').val()
            }
        };                                

    $.ajax({
        url: '/Contact/Edit',
        contentType: 'application/json; charset=utf-8',
        type: 'POST',
        dataType: 'json',
        data: JSON.stringify(contact)
    })
    .success(function (result) {
        // Display the section contents.
        alert('Contact updated succesfully!');
        window.location.href = result.Url;
    })
    .error(function (xhr, status) {
         alert('The provider could not be updated.');
    });

Id パラメータは、アクション メソッドと同じように呼び出されることに注意してください。複合型は、MVC フレームワークによって自動的に推測されます。唯一の条件は、プロパティに同じ名前を付ける必要があることです。

同じ結果を達成するための別のアプローチは、2 つの異なる JSON タイプを使用してコントローラー アクションを定義することです。例を次に示します。

コントローラーのアクション:

[HttpPost]
public ActionResult AddContact(TypeA  typeA, TypeB typeB)
{
    //Some logic...
}

JSON:

    var _typeA = { Id: $('#FieldId').val(),
            Name: $('#ContactName').val()
        }; 

    var _typeB = { Id: $('#FieldId').val(),
            Name: $('#ContactName').val()
        }; 

    $.ajax({
        url: '/Controller/Action',
        contentType: 'application/json; charset=utf-8',
        type: 'POST',
        dataType: 'json',
        data: {typeA:JSON.stringify(_typeA)},{typeB:JSON.stringify(_typeB)}
    })
    .success(function (result) {
        // Display the section contents.
        alert('Contact updated succesfully!');
        window.location.href = result.Url;
    })
    .error(function (xhr, status) {
         alert('The provider could not be updated.');
    });

これがあなたを助けることを願っています

于 2012-05-21T16:44:43.180 に答える
0

投稿しているjsonオブジェクトは文字列です(後でJavaScriptSerializerのメソッドを使用して逆シリアル化できます)。あなたが見逃しているのは、jquery ajax呼び出しでデータとして入れた価格変数のキーだと思います。投稿は通常、キーと値のペアのリストで構成されています。これは、サーバー技術が投稿されたデータから再構築してオブジェクトを作成できるようにするものでもあります。あなたの場合、価格変数のみがあります。
これを data:{PricesListAsString: price} に変更してみてください。サーバー上で、「渡される別のオブジェクト」を文字列 PriceListAsString に変更してください。
もちろん、コントローラーのデバッグ中に Request オブジェクトをチェックして、ポストされた値がサーバーにどのように渡されるかを確認することもできます。

于 2012-05-14T18:50:01.810 に答える