MVC: действие по обновлению только части модели при проверке на стороне клиента

#asp.net-mvc-2 #model #drop-down-menu #client-server #client-side

#asp.net-mvc-2 #Модель #выпадающее меню #клиент-сервер #на стороне клиента

Вопрос:

Это моя проблема.

У меня есть модель, состоящая из двух структур.

 public class MyDoubleStructureModel

    {
     public    MyDoubleStructureModel(CLIENT MyClient, List<PROVIDER> MyProviders);
     CLIENT MyClient {get;private set;};
     List<PROVIDER> MyProviders {get;private set;} ;
    }
  

Два объекта загружаются в начале загрузки страницы.
Объект «MyProviders» заполняет RenderPartial :

 <div id="dialog">
<% Html.RenderPartial("UCProviders", Model.MyProviders); %>
<%} %>
</div>
  

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

Моя идея состояла в том, чтобы вызвать (например, через jQuery) функцию на стороне сервера, которая обновила бы только одну часть моей модели.

 $("#ddlChangeProviders").change(function() {
                $.ajax({
                    type: "POST",
                    url: "/Client/UpdateListProvider/?provID="   $("#ddlChangeProviders").val()
                });
  

Но я не знаю, возможно ли обновить только часть моей модели (в данном случае часть «поставщики»).

Есть идея дополнить мой код? Я на правильном пути? Я полагаю, что отсутствует только «функция на стороне сервера «UpdateListProvider» (отображение обновленного списка поставщиков в PartialView)…

Это то, что должно быть в моей функции UpdateListProvider

 public ActionResult UpdateListProvider(int provID)
{
    List<PROVIDER> MyProvidersInMyModel = _entities.Providers.Where(c => c.PROV_ID == provID).ToList();

    var model = new MyDoubleStructureModel(null, MyProvidersInMyModel)

    return View(model);
}
  

Спасибо за вашу помощь.
(Спросите меня, если описание недостаточно четкое)

Ответ №1:

да, вы можете обновлять части своей модели с помощью jquery, а также с помощью обычной формы post. теперь вам просто нужно написать UpdateListProvider ActionResult и обновить поле providerId вашей модели. вы можете дополнительно возвращать true или false, показывая, что данные обновлены успешно или нет

 public ActionResult UpdateListProvider(int porvID)
{
    var model = //get model to update
    model.provID = provID
    if(Save(model))return Content("true");
    return Content("false");
}
  

на стороне клиента вы можете написать обратный вызов ajax для отображения сообщения об ошибке или успешном завершении

 $("#ddlChangeProviders").change(function() {
                $.ajax({
                    type: "POST",
                    url: "/Client/UpdateListProvider/?provID="   $("#ddlChangeProviders").val(),
                    success:function(data)
                           {
                               if(data == 'true'){alert('updated successfully');}
                               else{alert('could not update record');}
                           }
                });
  

Комментарии:

1. Спасибо за ваш ответ. Не могли бы вы подробнее описать «var model = // Получить модель для обновления»?

2. поскольку ваша цель — обновить модель. итак, когда у вас есть provID в методе action, вам просто нужно извлечь рассматриваемую модель из базы данных и т.д. И обновить ее поле provID. вы также можете передать уникальный идентификатор вашей модели в своем ajax-запросе, чтобы вы могли легко получить объект модели из базы данных

3. Что ж, я собираюсь задать по-другому свой предыдущий вопрос, который, возможно, кажется слишком простым, чтобы быть правдой :)) : какова строка кода, которая может использовать (и заполнять) «текущую модель» текущей формы? ‘Полный’ код строки: ‘var model = //получить модель для обновления’?

4. если вы можете вставить код вашего ActionResult, который отображает форму. я буду в лучшем положении, чтобы ответить на этот вопрос, и, пожалуйста, отредактируйте этот вопрос, чтобы вставить код, а не использовать комментарии

5. Хорошо, я обновил свой первоначальный пост 🙂 Надеюсь, это поможет. Кстати, спасибо тебе за твою помощь, Мухаммад.