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

Правильный способ POST данных MVC

Предупреждение: это мое первое веб-приложение.

У меня есть 4 модели, представления и контроллеры. Назовем их A, B, C, D (например, ModelA, ControllerA, ViewA). Все они являются базовыми представлениями со структурой списка.

/ControllerA/Index

Пользователь начинает с ViewA и выбирает первый элемент, который перенаправляет пользователя на ViewB

/ControllerB/Function?Aid=1

ViewB показывает другой список на основе выбора из ViewA. Затем пользователь Selects снова перенаправляется на ViewC.

/ControllerC/Function?Aid=1&Bid=2

ViewC показывает другой список, основанный на выборе из ViewA и ViewB. Затем пользователь Selects снова перенаправляется на ViewD.

/ControllerD/Function?Aid=1&Bid=2&Cid=3

ViewD показывает другой список, основанный на выборе из ViewA, ViewB и ViewC, затем пользователь выбирает снова.

На данный момент я хотел бы POST Aid, Bid, Cid и Did и сохранить их в своей базе данных. В идеале пользователь должен щелкнуть ссылку, данные будут опубликованы, а затем сайт перенаправит пользователя обратно на домашнюю страницу. Должен ли я создать другую модель и контроллер для обработки сообщения? Я думал о том, чтобы попытаться выполнить POST с контроллера D, но это не похоже на правильный способ сделать это.

Учебники msdn показывают публикацию только непосредственно из представления со строго типизированной моделью. Я как бы застрял, и я бы предпочел не делать из этого полный беспорядок.

Редактировать для кода Контроллер

  public ActionResult myFunction(int Aid = 0, int Bid, int Cid)
        {

           //query D stuff here


            if (D == null)
            {
                return HttpNotFound();
            }
            return View(D.ToList());



        }

        [HttpPost]
        [InitializeSimpleMembership]
        public ActionResult CreateQuote(int Aid, int Bid, int Cid, int Did)
        {
            Quote myQuote = new Quote();
            myQuote.Customer_ID_FK = (int)Membership.GetUser().ProviderUserKey;
            myQuote.A_ID_FK = Aid;
            myQuote.B_ID_FK = Bid;
            myQuote.C_ID_FK = Cid;
            myQuote.D_ID_FK = Did;

            if (ModelState.IsValid)
            {
                db.Quotes.Add(myQuote);
                db.SaveChanges();
                db.Quotes.Max();
                int mymax = db.Quotes.Max(q => q.ID);


                return RedirectToAction();

            }


            return View(D.ToList());
        }
        [HttpPost]
        [InitializeSimpleMembership]
        public ActionResult CreateQuote(Quote myQuote)
        {
            myQuote.Customer_ID_FK = (int)Membership.GetUser().ProviderUserKey;
            if (ModelState.IsValid)
            {

                db.Quotes.Max();
                int mymax = db.Quotes.Max(q => q.ID);
                db.Quotes.Add(myQuote);
                db.SaveChanges();

                return RedirectToAction();

            }

            return View(D.ToList());
        }
18.06.2013

Ответы:


1

Обычно имеет смысл поместить обработчик сообщений в контроллер, к которому он относится. Это не всегда так, поскольку иногда имеет смысл создать новый контроллер для обработки всех сообщений, связанных с определенной задачей. Вы также должны понимать разницу между методом В контроллере и контроллером. Контроллер — это просто класс, который наследуется от System.Web.Mvc.Controller и может иметь методы, как и любой другой класс. Вполне разумный контроллер может выглядеть так:

public class DController : Controller
{

    //GET /d
    public ActionResult Index()
    {
        //MyModel is a class that would contain the logic to display
        //the selections from A, B, and C
        var model = new MyModel();
        return View(model);
    }

    //POST /d/saveresults
    //We only want this method to accept POST
    [HttpPost]
    public ActionResult SaveResults(MyEntity data)
    {
        var model = new MyModel();
        model.SaveResultsToDatabase(data);

        return Redirect("/");
    }
}

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

18.06.2013
  • Как создать ссылку на SaveResults в представлении? Я не могу понять, как превратить Aid, Bid, Cid, and Did в объект (MyEntity в вашем примере), чтобы я мог отправить его. В моем представлении уже используется ModelD. Могу ли я добавить в представление вторую модель? 18.06.2013
  • Существуют разные стратегии борьбы с этим. Самый простой/основной способ — заключить данные, которые вы хотите отправить на сервер, в ‹форму›. MVC возьмет параметры POST и попытается проанализировать их в указанный вами объект. Вам не нужно явно выполнять какое-либо преобразование перед выполнением POST. В более сложных сценариях вы, скорее всего, разберете свои объекты в JSON, а затем отправите JSON на сервер. 19.06.2013
  • Спасибо за вашу помощь, с вашим ответом и изучением немного больше о http, я думаю, что наконец понял. 19.06.2013
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге 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 , и использованием..

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