この問題の解決策を長い間探しましたが、まだ何も見つかりません。使用しているコントローラー/ビューのモデルとして、強い型を定義しました。問題は、モデルが他の複雑な型を参照しているため、そのモデルのセクションを部分的に更新する必要があることです。たとえば、ページの 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);
}
前もって感謝します!