Как MVC 5 просматривает запрос с данными параметров контроллера для запуска другого представления - PullRequest
0 голосов
/ 17 февраля 2020

Это MVC 5 проект. У меня проблема с получением второго представления для отображения из родительского представления. Мой родительский вид - это заказ на покупку, в котором есть позиции. Позиции должны быть добавлены путем запуска второго представления из родительского представления. Оба представления используют один и тот же контроллер, но у каждого свой метод действия. Я использую ниже JavaScript из представления PurchaseOrder для передачи данных в представление PurchaseOrderAddItem (дочернее представление):

   $(document).ready(function () {
        $('#PurchaseOrderLineItemAddId').click(function () {
            var aPurchaseOrderViewModel = @Html.Raw(Json.Encode(Model));    
            var selectedVendorText = $('#ddlvendors option:selected').text();
            var selectedVendorValue = $('#ddlvendors option:selected').val();  
            var LineItemReqJsonObj = {};

            LineItemReqJsonObj.PurchaseOrderId = aPurchaseOrderViewModel.PurchaseOrderId;
            LineItemReqJsonObj.VendorText = selectedVendorText;
            LineItemReqJsonObj.VendorValue = selectedVendorValue;

            var dataToPass = '{aLineItemReqJsonObj: ' + JSON.stringify(LineItemReqJsonObj) + '}';

                $.ajax(
                    {
                        type: "POST",
                        //data: '{ aPurchaseOrderViewModel: ' + JSON.stringify(aPurchaseOrderViewModel) + ' }',
                        //data: aPurchaseOrderViewModelStr,
                        data: dataToPass,
                        url: '@Url.Action("PurchaseOrderAddItem")',
                        contentType: "application/json; charset=utf-8",
                        datatype: "json"
                    })
               .done(function (aNewLineItemViewModel) {
                    AddNewLineItemReceived(aNewLineItemViewModel);
                    })
                    .fail(function (xhr) {
                        alert('error', xhr);
                    });   
        });
    });

Ниже приведен метод действия в контроллере, который получает указанный выше запрос ajax:

[HttpPost]
public ActionResult PurchaseOrderAddItem(LineItemReqJsonObj aLineItemReqJsonObj)
{
  LineItemViewModel aLineItemViewModel = new LineItemViewModel();

  aLineItemViewModel.PurchaseOrderId = aLineItemReqJsonObj.PurchaseOrderId;
  aLineItemViewModel.VendorId = Convert.ToInt32(aLineItemReqJsonObj.VendorValue);

  return View(aLineItemViewModel);
}

Ниже приведен класс в контроллере, который получает данные, заполненные в него, когда они передаются из JavaScript:

   public class LineItemJsonObj
    {
      public string PurchaseOrderId {get;set;}
      public string VendorText { get; set; }
      public string VendorValue { get; set; }
    };

Следующая диаграмма иллюстрирует то, что я пытаюсь сделать :

enter image description here

Как видно из диаграммы, я не могу получить представление PurchaseOrderAddItem для отображения. Как получить представление PurchaseOrderAddItem для отображения, получая данные параметров, после того, как представление PurchaseOrder вызвало действие PurchaseOrderAddItem из контроллера? Заранее спасибо.

- ОБНОВЛЕНИЕ 2/17/2020 1: 38PST-- Я, вероятно, ошибаюсь, полагая, что контроллер может запустить представление PurchaseOrderAddItem, которое при закрытии может каким-то образом вернуть полученные данные новой модели обратно в BuyOrder View с JavaScript, с которого это началось.

Я начинаю думать, что этот подход с использованием JavaScript $ Ajax для достижения контроллера не является правильным способом сделать это. Сейчас я проверяю, возможно ли мне просто загрузить другую веб-страницу из представления PurcahseOrder с данными параметров для создания нового представления PurchaseOrderAddItem. Задача здесь, однако, заключалась бы в том, чтобы, вероятно, упаковать все данные модели представления PurchaseOrder в go с помощью запроса Просмотр PurchaseOrderAddItem. Если при выходе из представления PurchaseOrderAddItem у меня будут полные данные модели представления PurchaseOrder, я смогу загрузить новое представление PurchaseOrder и передать ему все данные, которые были в первом экземпляре, поэтому он будет заполнен для добавления новых добавленных позиций. Я не уверен, что это правильный способ сделать это. Я еще не видел примеров того, как решается проблема с представлением представления приложения. Я был бы признателен, если бы кто-нибудь мог указать мне на какие-нибудь целые rnet статьи, которые, возможно, посвящены тому, как разрабатывать приложения такого типа MVC. Это очень легко сделать в настольных приложениях, но веб-разработка с MVC делает это совершенно другим и требует гораздо больше работы, чем что-либо в WPF или WinForms.

1 Ответ

0 голосов
/ 19 февраля 2020

Решением для меня в этом случае было использование словарного объекта TempData, чтобы помочь переносить данные из запроса на представление PurchaseOrder в представление LineItem и обратно. В этом транспорте нет конфиденциальных данных, поэтому использование TempData должно быть в порядке. Кроме того, для запуска представления LineItem для создания нового элемента строки мне было удобнее просто использовать стандартное действие отправки из блока Html .BeginForm. Стандартная операция отправки, предоставляемая кнопкой отправки, - это то, что я использовал в этом случае, а не кнопку для запуска кода $. Ajax в JavaScript. Ajax в этом случае действительно не требовалось, так как все представление PurchaseOrder должно было быть заменено представлением создания LineItem.

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