Создание новой записи с использованием AJAX в ASP.NET-MVC - PullRequest
1 голос
/ 26 марта 2010

У меня самое сложное время, чтобы обернуть голову вокруг этого. Я недавно задал этот вопрос Создание / редактирование / сохранение данных во всплывающем окне jQuery для ASP.NET-MVC и Linq2Sql Я уверен, что ответ - правильный путь, но я просто могу Не могу понять, как написать внутренний код, чтобы он работал. Первоначально я сделал свой сайт, следуя учебнику nerddinner. У меня есть модель субконтрактов и контроллер субконтрактов. На моей странице ввода субподряда я хотел бы, чтобы было всплывающее окно / диалоговое окно, в котором пользователь может ввести новую компанию, если компания еще не включена в раскрывающийся список. Нужно ли создавать новый контроллер компании? У меня не было бы модели компании, поскольку таблица компании связана с моей таблицей субконтрактов в базе данных субконтрактов.

Может кто-нибудь указать мне пример где-нибудь? Или предложите любую помощь.

EDIT: Когда вызывается метод company / create, все поля имеют значение null.

Вот код:

<div id="popupCreateCompany" title="Create a new company"> 
    <p>  
        <label for="company_name">Company Name:</label><br />
        <%= Html.TextBox("company_name") %>    
    </p>
    <p>
        <label for="company_desc">Company Description:</label><br />
        <%= Html.TextBox("company_desc") %>
    </p>  
    <p>
        <label for="address">Address:</label><br />
        <%= Html.TextBox("address") %>
    </p>
    <p>
        <label for="city">City:</label><br />
        <%= Html.TextBox("city") %>
    </p>
    <p>
        <label for="state">State:</label><br />
        <%= Html.TextBox("state") %>
    </p>
    <p>
        <label for="zip">Zip:</label><br />
        <%= Html.TextBox("zip") %>
    </p>
    <p>
        <label for="website">Website:</label><br />
        <%= Html.TextBox("website") %>
    </p>
 </div>  

код запроса:

            $("#create-company").click(function() {
            //centerPopup();
            //loadPopup();
            $('#popupCreateCompany').dialog(
                {
                    modal: true,
                    buttons:
                    {
                        'Add': function() {
                            var dialog = $(this);
                            var form = $(this).find('#popupCreateCompany');
                            $.post('/company/create', $(form).serialize(), function() {
                                dialog.dialog('destroy');
                            })
                        },
                        'Cancel': function() {
                            dialog.dialog('destroy');
                        }
                    }
                });

        });

Кроме того, мои поля отображаются в виде отдельного поля в верхней части диалогового окна. альтернативный текст http://i39.tinypic.com/2hhg4kh.jpg

Ответы [ 2 ]

3 голосов
/ 26 марта 2010

Вам не нужно создавать новый контроллер. Отправка формы через jQuery на самом деле ничем не отличается от отправки формы нажатием кнопки мыши.

Код из предыдущего ответа:

$.post('/company/new', $(form).serialize(), function() {
                            dialog.dialog('destroy');
                        }

будет публиковать каждое поле вашей формы в POST-запросе, как обычно. Если вы называете поля формы так, что они представляют свойства объекта и, таким образом, могут быть привязаны к объекту модели, как обычно, вы можете создать свой метод действия как обычный:

public ActionResult New(CompanyDetails newCompany)
{
    if (ModelState.IsValid)
    {
       // Insert newCompany into database.
    }
}

Вы также можете просто использовать параметр FormCollection и TryUpdateModel () для заполнения созданного вами объекта:

public ActionResult New(FormCollection postedValues)
{
    // Create a new Company() here and just call TryUpdateModel() on it:
    var company = new Company();
    TryUpdateModel(company);
    if (ModelState.IsValid)
    {
        /// Insert
    }
}

Если по какой-либо причине ваши поля формы не могут соответствовать свойствам объекта, то вы можете выбрать «ручной» способ и просто найти в параметре FormCollection нужные вам данные поля и выполнить бизнес-логику для создания новой компании с опубликованными значениями.

Как только вы закончили создание своей компании, вы должны помнить, что метод действия был вызван через ajax, и это обратный вызов jQuery, который будет обрабатывать ответ. Вы можете вернуть JsonResult, который просто указывает на успех или неудачу, и просто закрыть диалоговое окно или вернуть полное представление, которое обратный вызов jQuery будет обрабатывать как HTML-данные и отображать в диалоговом окне.

2 голосов
/ 26 марта 2010

URL, который я использовал в своем ответе на ваш предыдущий вопрос, был просто примером. Вы также можете легко иметь метод на существующем контроллере, который создает новую компанию. Что касается отсутствия «модели» компании - я бы сказал, что у вас она уже есть. Он находится в том же контексте данных, что и ваш Субконтракт - возможно, вы имеете в виду, что у вас нет хранилища Компании.

В зависимости от того, как вы структурировали свое хранилище, вам может понадобиться или не потребоваться отдельное хранилище для модели Компании. Если вы используете репозиторий для каждой модели (строго типизированный репозиторий), то вам нужен отдельный репозиторий, когда вы имеете дело непосредственно с компаниями. Если вы используете несколько моделей для каждого шаблона хранилища (строго типизированные методы), то, вероятно, вам не нужна другая.

В любом случае вам необходим метод на некотором контроллере для создания компании. Вероятно, я бы выбрал отдельного контролера компании, так как вы также можете заранее иметь возможность создавать новые компании без учета какого-либо конкретного контракта. Использование отдельного контроллера будет разделять логику для их обработки, что приведет к меньшей связи с вашими субподрядными классами, если вам в конечном итоге потребуется расширить приложение.

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