既存のモデル(特にそれらに関連付けられている読み込み/保存機能)を再利用しようとしているため、それらを現在のモデルに集約しましたモデル:ASP.NET MVC 2.0:POSTアクションでモデルのサブモデルが表示される
public class EditModel {
public SubModel1 {get; set; }
public SubModel2 {get; set; }
/* ID and some text fields */
}
問題がある、私は、フォームを記入し、これらのサブモデルはすべてデフォルト/空のコンテンツを持っているPOSTに関連付けられたアクションで、提出ヒットした後。
/// POST for Edit
[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult EditCommunity(EditCommunityModel model) {
if (bad stuff happened)
return Json("Failure");
//model.SubModel1 is != null, but all fields are empty.
// ID and the aforementioned text fields come correctly.
Save(model.ID, model.SubModel1, model.SubModel2);
return Json("Succeeded");
}
私は編集同等のための.aspxのを使用した場合、問題なく前にこの再利用を行ってきたので、適切にモデルを構築するためにGETアクションを呼び出します。しかし、私はモーダルダイアログで編集しようとしているので、私はascxに制限されています(もしdivにaspxをロードする方法があれば、この問題は終わりですが、これは私には逆です私は何をしようとしているのかということです。私は、私が適用しようとした2つの戦略も追加します。どちらも同じ効果があります:空のサブモデル。
最初に試してみてくださいは、AJAX呼び出しを使用してEdit.ascxを設定しました。 Edit.ascx
では、編集ダイアログのラッパーがManage.aspxに含まれていた、とEditModelは、任意の初期グリッドで
<div id="editDialog" style="display: none;">
<% Html.RenderPartial("Edit", new EditModel()); %>
</div>
ずに渡された、セルが編集としてマークされるだろう、とクリックで次のように呼ぶだろうjavascript関数:
function onSelectRowEdit_Click(id) {
if (id) {
//Get data from selected row
var ret = jQuery("#table_grid").getRowData(id);
//Show Edit modal control
var actionUrl = '<%= Url.Action("EditInfo", "Manage") %>';
var data = "externalId=" + ret.OrgId + '&Id=' + ret.Id;
$.ajax({
type: "POST",
url: actionUrl,
data: data,
error: AjaxError,
success: ShowEdit
});
}
}
EditInfo(string, string)
その後、ShowEditによって受信された化するJsonResultを作成して返します。 showEditはEdit.ascxを記入し、ダイアログとしてdiv要素を提示するのjQueryを使用します。
function ShowRes(ret) {
$("#form_Edit").validate();
jQuery("#editDialog").dialog('destroy');
Init_EditDialog();
/* $('#...').val(ret...);, many times over */
//Show Dialog
$("#editCommunityDialog_Content").show();
$("#editCommunityDialog").dialog('open');
}
セカンドがnew EditModel()
をバイパスして、コントローラによって返されたビューを使用しようとしてみてください。最初の試行と全く同じコードを達成しましたが、提出時に同じ問題がありました。
<div id="editDialog" style="display: none;"></div>
<!-- ... -->
function onSelectRowEdit_Click(id) {
if (id) {
//Get data from selected row
var ret = jQuery("#table_communities").getRowData(id);
//Show Edit community modal control
var actionUrl2 = '<%= Url.Action("ShowEdit", "Manage",
new { CommunityId="_COMMID_", ExternalId="_ORGID_" }) %>';
editImg = editImg.replace("_COMMID_", ret.Id);
editImg = editImg.replace("_ORGID_", ret.OrgID);
$.ajax({
type: "POST",
url: actionUrl2,
data: data,
error: AjaxError,
success: ShowRes
});
}
}
ShowEditはView("Edit", model)
を返すように書き直された、とshowresコマンドは単純にdiv要素のHTMLに結果を書きます。
function ShowRes(ret) {
//...
$("#editDialog_Content").html(ret);
//Show Dialog
}
言うまでもなく、Edit.ascx
のフォームは、問題がどこから来るので、それはないです<%= Html.HiddenFor(m => m.SubModel1.EditProfile)%>
などの分野があります。
この記事とその扶養家族はすべての非常に興味深いものでした。残念ながら、私の状況には当てはまりません。Index(Basket)に相当するのは 'ShowEdit(string communityId、string externalId)'です。 ModelStateにはこれらの2つの値しか含まれていないため、何も消去されません(さらに、これらはEdit.ascxの目的のための定数なので実際には便利です)。しかし、それは興味深い事実を私に教えてくれました: 'EditCommunity(EditCommunityModelモデル)'では、ModelStateはIdと非サブモデルのフィールドだけを含みます。 'ModelState [" SubModel1_EditProfile "]'の行には何もありません。 – Liz