2015-04-30 3 views
0

Длинные намотки по необходимости:Разрешение нескольких должностей из формы MVC 4 с результатами на той же странице

У меня есть строго типизированная форма MVC 4. Форма создается динамически в зависимости от текущих параметров URL. Когда пользователь отправляет форму, входные данные формы отправляются на контроллер, контроллер делает это, тогда результаты из метода контроллера должны отображаться ниже формы.

В частности, в моем случае результатом являются данные о позиции. Пользователь может нажать «отправить» столько раз, сколько захочет, и каждый раз, когда дополнительные результаты от контроллера отображаются на одной странице ниже формы; Каждый пост является добавленной позицией. (Позиции запрашиваются/сохраняются вызовом внешнего webapi, поэтому каждый раз, когда выполняется передача, я перестраиваю позиции из своего метода контроллера).

То, что я пытаюсь сделать, - это не обновлять страницу каждый раз, чтобы создавать форму заново, просто обновляя позиции под формой через вызов ajax. Форма дорого строится, потому что она также построена из внешнего веб-ави. Моя модель очень большая и имеет множество данных, хотя сама форма не является.

До сих пор я пытался поставить позиции на частичный вид, который я буду обновлять после каждого представления формы. Я отправляю форму с помощью jQuery и Ajax. То, что, кажется, происходит, представляет форму, вызывается метод ajax, но мой контроллер сразу возвращает частичный вид и макет главной страницы. Это не возврат к вызову jQuery. Это может быть Sitefinity, или это может быть то, что я делаю совершенно неправильно.

Что у меня есть до сих пор: http://beta.kentuckycenter.org/all-shows/jeff-beck. Нажмите «Купить билеты» на этой странице, чтобы просмотреть форму.

Отправить форму (нажмите «GO»), тогда форма отправляет и возвращает только частичный вид.

Но это должно выглядеть следующим образом (это дизайн только): http://www.kentuckycenter.org.staging01.spiiider.com/select-tickets.php

Sitefinity MVC виджетов изменить сложность наверняка. Моя настройка - мастер-страница (шаблоны Sitefinity построены из мастер-страниц), затем представление по умолчанию и частичное представление. Я пытаюсь обновить частичный вид внутри представления по умолчанию.

Я пробовал много разных способов, включая форму ajax.beginform, но я все еще не могу получить частичное представление для возврата в представление по умолчанию. Я не могу передать свои исходные данные SelectTicketsModel в скрытые поля, потому что некоторые элементы являются списками других моделей.

контроллера действие упрощено:

public ActionResult Index(string performanceID, string pageID) 
     { 
      var Model = new SelectTicketsModel(); 

      Model = Model.GetPerformanceDetails(performanceIDnew, productionID); 

      return View("Default", Model); 
     } 

     [AcceptVerbs(HttpVerbs.Post)] 
     public ActionResult Index(GetTicketsModel Model) 
     { 
      //call webapi to reserve tickets 
      ticketsReserved = Model.ReserveTickets(Model.PriceType, performanceID, numberOfTickets, zoneID, Model.Accessible); 

      if (ticketsReserved == numberOfTickets) 
      { 
       LineItemModel lineModel = new LineItemModel(); 
       //Fill LineItemModel from webpapi 
      } 

      return PartialView("TicketList", LineItemModel); 
     } 



public class SelectTicketsViewModel 
    { 
     public bool Results { get; set; } 
     public int PerformanceID { get; set; } 
     public Nullable<DateTime> PreSaleDateStart { get; set; } 
     public Nullable<DateTime> PreSaleDateEnd { get; set; } 
     public bool HideSYOS { get; set; } 
     public bool IsGeneralAdmission { get; set; } 
     public bool WillCallOnly { get; set; } 
     public bool IsOnSale { get; set; } 
     public bool IsSoldOut { get; set; } 
     public int MaxSeats { get; set; } 
     public int ZoneMapID { get; set; } 
     public string TimeSlot { get; set; } 
     public string Title { get; set; } 
     public DateTime PerformanceDate { get; set; } 
     public string Location { get; set; } 

     // Create Lists from Models below 
     public List<PriceZoneModel> PriceZones { get; set; } 
     public List<PriceTypeModel> PriceTypes { get; set; } 
     public List<LineItemModel> LineItems { get; set; } 
    } 

    public class PriceZoneModel 
    { 
     public int PriceZoneID { get; set; } 
     public string PriceZoneDescription { get; set; } 
     public int PriceTypeID { get; set; } 
     public string PriceTypeDescription { get; set; } 
     public decimal Price { get; set; } 
     public decimal BasePrice { get; set; } 
     public bool Available { get; set; } 
     public int AvailableCount { get; set; } 
     public int Rank { get; set; } 
    } 

    public class PriceTypeModel 
    { 
     public int PriceTypeID { get; set; } 
     public string PriceTypeDescription { get; set; } 
     public string PriceTypeShortDescription { get; set; } 
     public string Category { get; set; } 
     public bool IsDefaultPriceType { get; set; } 
     public bool IsPromo { get; set; } 
    } 

    public class LineItemModel 
    { 
     int id { get; set; } 
     bool AccessibleSeats { get; set; } 
     public List<SubLineItemModel> SubLineItems { get; set; } 
    } 

    public class SubLineItemModel 
    { 
     public string Section { get; set; } 
     public int NumberOfSeats { get; set; } 
     public string SeatNumber { get; set; } 
     public int SeatID { get; set; } 
     public decimal Price { get; set; } 
     public string PriceTypeDescription { get; set; } 
    } 

    public class GetTicketsModel 
    { 
     //Form Values needed to Reserve Tickets 
     public string NumberOfTickets { get; set; } 
     public string PriceType { get; set; } 
     public string ZoneID { get; set; } 
     public bool Accessible { get; set; } 
     public string PerformanceID { get; set; } 
    } 
+0

Необходимо показать свое мнение, но, без сомнения, оно связано с тем, что вы не включили соответствующий 'jquery.validate-ajax.js', поэтому' Ajax.BeginForm() 'делает стандартный submit, а не ajax-вызов. Примечание. Я также отредактировал теги. Тег модели-view-controller предназначен для вопросов о шаблоне, а не о структуре MVC. –

ответ

0

Если возвращенное Ajax открывает на новой странице, это звучит, как вы не используете ненавязчивую библиотеку.

Убедитесь, что на вашей странице cshtml или даже в вашем файле макета содержится следующий файл: (если вы используете ajax на своем сайте).

jquery.unobtrusive-ajax.js 

Where can one download Microsoft jQuery Unobtrusive Validation without using NuGet

Из звуков этого, ваш метод возвращает данные в частичное и обновление переднего конца элемент должен работать нормально.

Единственное, что я бы высматривать, что вы должны передать переменную в качестве модели, а не класс

 if (ticketsReserved == numberOfTickets) 
     { 
      LineItemModel lineModel = new LineItemModel(); 
      //Fill LineItemModel from webpapi 
     } 

     return PartialView("TicketList", lineModel); //<-- here 

EDIT

Да, я смотрел на свой бета-ссылку и страница не содержит ненавязчивого-ajax.js. Это должно решить вашу проблему.

0

Если вы получаете всю страницу в качестве ответа от контроллера по вызову Ajax, это вещь sitefinty. Попробуйте вернуть свой список из результата действия в качестве Json (items, allow get) вместо частичного представления? Также наблюдаемые кендо или сетка кендо заставляют данные о необходимости наблюдать, также будут отличными решениями.

Смежные вопросы