ASP.NET MVC 2.0: заставить действие POST получать подмодели моей модели - PullRequest
0 голосов
/ 26 ноября 2010

Я пытаюсь повторно использовать некоторые существующие модели (и особенно связанные с ними функции загрузки / сохранения), поэтому я объединил их в текущую модель:

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)%>, поэтому проблема не в этом.

1 Ответ

0 голосов
/ 26 ноября 2010

Попробуйте проверить мой ответ на этот вопрос, чтобы увидеть, поможет ли это: Как работать с моделями PartialRender?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...