Я пытаюсь повторно использовать некоторые существующие модели (и особенно связанные с ними функции загрузки / сохранения), поэтому я объединил их в текущую модель:
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 для эквивалента Edit, и поэтому вызову GET Action для правильного построения Модели. Но теперь я ограничен ascx, потому что я пытаюсь редактировать в модальном диалоговом окне (если есть способ загрузить aspx в div, тогда эта проблема решена; но мне кажется, это будет противоречить для чего предназначен aspx.)
Короче говоря, это то, что я пытаюсь сделать; Я также добавлю две стратегии, которые я пытался применить, каждая из которых имеет одинаковый эффект: пустые подмодели.
Первая попытка использовала 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)
создаст и вернет JsonResult, который затем был получен ShowEdit; showEdit заполнил бы Edit.ascx и использовал бы jQuery для представления div в виде диалога:
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()
и использовать представление, возвращаемое контроллером. Он действительно достиг того же результата, что и первая попытка, со значительно меньшим количеством кода, но имел ту же проблему при Submit.
<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 просто записал бы результат в HTML-файл div.
function ShowRes(ret) {
//...
$("#editDialog_Content").html(ret);
//Show Dialog
}
Излишне говорить, что форма в Edit.ascx
имеет такие поля, как <%= Html.HiddenFor(m => m.SubModel1.EditProfile)%>
, поэтому проблема не в этом.