Как я могу временно перейти к другому представлению для создания объектов

Я новичок в asp.net MVC и должен решить, как реализовать следующее. Может ли кто-нибудь указать мне в правильном направлении

У меня есть контроллер, который служит для создания клиентов, и все работает нормально.

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

Итак, мой вопрос заключается в том, как из моего контроллера счета-фактуры я могу заставить контроллер клиента создать клиента, вернуть данные этого клиента и подключить эти данные к моему представлению счета-фактуры.

Эти контроллеры/представления живут в разных областях


person Amitesh    schedule 12.07.2010    source источник


Ответы (2)


Помните, что контроллеры обслуживают определенные запросы (получить клиента, просмотреть клиента, создать счет).

В вашем случае вам не нужно «заставлять контроллер клиента создавать клиента».

Просто создайте обычный метод, который называется, например, «GetCustomer». Это может быть вызвано из нескольких контроллеров. Этот метод может жить где угодно - возможно, в сборке помощников в пространстве имен вашей модели (при условии, что ваша модель находится в отдельной библиотеке классов, что я и делаю). Просто вызовите это из контроллера Invoice.

Вы не хотите перемещаться туда и обратно от контроллеров - это противоречит принципу MVC.

Так должно быть

URL Request -> Controller -> Model -> Controller -> View.

нет

URL Request -> Controller -> Controller -> Model -> Controller -> View.

Вот что я имею в виду.

Контролер клиентов:

public ActionResult Index(int customerId)
{
   var customer = Model.GetCustomerById(customerId);
   return View(customer);
}

Контролер счетов:

public ActionResult GetInvoice(int customerId)
{
   var customer = Model.GetCustomerById(customerId);
   return View("Invoice", customer);
}

Модель:

public Customer GetCustomerById(int customerId)
{
    var customer = yourDatabaseRepository.GetCustomerById(customerId);
}

Знаешь что я имею ввиду? Ключ не помещает логику «GetCustomer» в контроллер — абстрагируйте ее в модель — доступную для всех контроллеров.

person RPM1984    schedule 12.07.2010

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

Затем вы можете перенаправить пользователя следующим образом (обратите внимание, что я включил обратный URL-адрес и имя клиента), ваш клиентский контроллер может принять эти параметры и предварительно заполнить поле имени, а также перенаправить обратно:

RedirectToAction("Create", "Customer", new { returnUrl = "YourUrl", NewCustomerName = "NewCustNameHere" }

Если вы хотите сделать это автоматически, я бы сделал это методом, предложенным RPM.

person matto0    schedule 12.07.2010
comment
Я должен был добавить с моим перенаправлением, я предполагаю, что вам нужно ввести другую информацию для клиента, например, адрес и т. д. Поэтому я просто предварительно заполняю информацию, которую мы уже знаем, и предоставляю обратный URL-адрес после повторной отправки формы клиента. . - person matto0; 12.07.2010