Arhn - архитектура программирования

Как обновить частичное представление на главной странице индекса в отправке из отдельного модального окна частичного представления

У меня есть главная страница индекса, которая загружает частичное представление, содержащее раскрывающийся список. Выбор элемента из ddl заполняет элементы управления в отдельном частичном представлении для отображения. При нажатии кнопки «Изменить» открывается модель с формой редактора для элементов управления, привязанных к свойствам модели для выбранного элемента. Когда нажата кнопка отправки для модального окна. Он отправляет обратно форму для обновления в базу данных ... и в этот момент я хочу в основном обновить частичное представление, содержащее раскрывающийся список, чтобы он отражал соответствующие изменения.

Код, который у меня есть, выполняет все основные механизмы без проблем, ЗА ИСКЛЮЧЕНИЕМ обновления частичного представления, содержащего раскрывающийся список для управления. Я мог бы просто выполнить перенаправление для страницы индекса и обновить всю страницу, но я бы предпочел обновить только частичное представление. Я не могу понять, как это сделать, и мне интересно, есть ли у кого-нибудь предложения.

Код div для страницы индекса:

@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
<br />
<div class="partialContent" data-url="/Database/GetDatabases">
       @Html.Partial("_GetDatabases")
    </div>
<br />


<div class="modal fade" id="modalEditDBInfo" role="application" aria-labelledby="modalEditDBInfoLabel" aria-hidden="true">
    <div class="modal-dialog">
        <div class="modalEditDBInfoContent" style="background-color:white; border-radius:10px; box-shadow:10px;">
            @Html.Partial("_EditDatabaseInfo")
        </div>
    </div>
</div>

Код для частичного представления EditDatabase

@model Hybridinator.WebUI.Models.DatabaseModel
<br />
<br />

<div class="modal-header">
    <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
    <h4 class="modal-title" id="editModelTitle">Edit Database Info</h4>
</div>
@if(Model != null)
{ 
    using (Html.BeginForm("EditDatabaseInfo", "Database", FormMethod.Post, new { @class = "modal-form" }))
    {
        <div class="modal-body">
            @Html.HiddenFor(m => m.database_pk, new { htmlAttributes = new { @class = "form-control" } })
            <div class="form-group">
                <div id="databaselabel">@Html.LabelFor(m => m.database_name, "Database")</div>
                <div id="databaseedit">@Html.EditorFor(m => m.database_name, new { htmlAttributes = new { @class = "form-control" } })</div>
            </div>
            <div class="form-group">
                <div id="databaseserverlabel">@Html.LabelFor(m => m.database_server, "Database Server")</div>
                <div id="databaseserveredit">@Html.EditorFor(m => m.database_server, new { htmlAttributes = new { @class = "form-control" } })</div>
            </div>

            </div>

            <div class="form-group">
                <div id="editsqltypelabel">@Html.LabelFor(m => m.sql_type_pk, "Sql Type")</div>
                <div id="editsqltypeddl">@Html.DropDownListFor(m => m.sql_type_pk, Model.sqlTypes)</div>
            </div>

            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
                <button class="btn btn-inverse btn-primary" type="submit">Save</button>
            </div>
    }       
}

Код для частичного просмотра GetDatabases

@model Hybridinator.WebUI.Models.DatabaseListModel
@if(Model != null)
{    
    <div id="databasedropdown" class="container-fluid">
        @Html.Label("Databases: ")@Html.DropDownListFor(m => m.database_pk, Model.databases, "Select one...", new { @id = "database_pk", onchange = "changeDatabase()" })  
    </div>
}

Код контроллера для GetDatabases

public ActionResult GetDatabases()
        {
            DatabaseListModel databaseListModel = new DatabaseListModel
            {
                databases = databaseService.GetUndeletedDatabaseList().
                    Select(d => new SelectListItem
                    {
                        Value = d.database_pk.ToString(),
                        Text = d.database_name
                    }).ToList()
            };
            return PartialView("_GetDatabases",databaseListModel);
        }

и последний код для Get и Post для модального окна EditDatabase

[HttpGet]
public ActionResult EditDatabaseInfo(int database_pk)
{
    DatabaseModel databaseModel = FillDatabaseModelByDatabasePK(database_pk);
    return PartialView("_EditDatabaseInfo", databaseModel);
}
[HttpPost]
public ActionResult EditDatabaseInfo(DatabaseModel databaseModel)
{
    string[] result = databaseService.Update(new Database
    {
        database_pk = databaseModel.database_pk,
        database_name = databaseModel.database_name,
        database_password = databaseModel.database_password,
        database_username = databaseModel.database_username,
        database_server = databaseModel.database_server,
        hist_database_name = databaseModel.hist_database_name,
        hist_database_server = databaseModel.hist_database_server,
        hist_database_password = databaseModel.hist_database_password,
        hist_database_username = databaseModel.hist_database_username,
        sqlType = new SQLType { sql_type_pk = databaseModel.sql_type_pk }
    });
    return RedirectToAction("GetDatabases");
}

Как я уже сказал, RedirectToAction ("Index), возвращаемый в методе контроллера Post EditDatabase, работает в крайнем случае ... но я действительно не хочу обновлять всю страницу. Я предполагаю, что есть кое-что, что я могу сделать по-другому, вернув этот метод просто перезагрузить часть GetDatabases, но я не могу понять. Любая помощь будет принята с благодарностью.


  • Если вы используете форму Ajax.Begin, вы можете обновить частичное и закрыть диалог в функции, вызываемой через onsuccess, или то же самое в необработанном запросе ajax в обработчике успеха. 15.11.2014
  • Ваше предложение сработало как шарм, большое спасибо! 15.11.2014
  • Нет проблем, рад, что помог :) 16.11.2014

Ответы:


1

Карл, который комментирует выше, предоставил решение. Но, поскольку он только что прокомментировал, я опубликую здесь изменения кода, поэтому, если кто-то ищет аналогичную проблему, они могут увидеть код.

В соответствии с предложением Карла я использовал Ajax.BeginForm вместо HTML.BeginForm и IM, обновляя контроллер частичного представления через обработчик onsuccess.

Я заменил эту строку в партиале EditDatabase

     using (Html.BeginForm("EditDatabaseInfo", "Database", FormMethod.Post, new { @class = "modal-form" }))

с этим

using (Ajax.BeginForm("EditDatabaseInfo", "Database", new AjaxOptions{
            InsertionMode = InsertionMode.Replace,
            HttpMethod = "POST",
            OnSuccess = "editDatabaseSuccess"        
        }, new { @id = "editDatabaseForm" }))

Затем в своих скриптах я сделал функцию для editDatabaseSucess

<script type="text/javascript">
    function editDatabaseSuccess(data)
    {
        //alert(data);
        $('#modalEditDBInfo').modal('hide');
        loadDatabases();
    }
</script>

Строка alert (data; закомментированная) предназначена только для тестирования, чтобы убедиться, что функция вызывается. Строка loadDatabases (); вызывает функцию, которую я использую при загрузке страницы для загрузки частичного представления.

<script type="text/javascript">
    function loadDatabases()
    {
        $(".partialContent").each(function (index, item) {
            var url = $(item).data("url");
            if (url && url.length > 0) {
                $(item).load(url)
            }
        });
    }
</script>

Теперь работает отлично. Большое спасибо Карлу за ответ.

15.11.2014
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..