MVC 3 Как создать форму с методом Post Redirect Get при сохранении представлений - PullRequest
3 голосов
/ 01 марта 2012

Я прочитал ЛОТ на стеке и прочитал еще несколько статей о том, как создать правильную форму.Я закончил тем, что принял метод PRG. статья здесь

Проблема, с которой я сталкиваюсь, заключается в том, чтобы заставить ее работать в IE 8. Это работает в Firefox.Я просто хочу знать, что я делаю не так.

Обновление

Проверка формы теперь исправлена ​​благодаря методам проб и ошибок.Скрипты проверки с IE НЕ работают с Jquery 1.7.Они работают с Jquery 1.5, как и положено.

Редактировать
Проверка формы также не работает в IE с этой текущей настройкой.Любой свет в этом будет приветствоваться.

Проблемы

1. На самом деле представление представления загружается как частичное представление, которое находится внутри представления индекса.Изобразите всплывающее окно, чтобы добавить нового подписчика.

Поэтому, когда форма отправляется и становится недействительной, она переходит к частичному представлению Create, которое теперь выглядит нелепо, поскольку частичное представление предназначалось для всплывающего окна, а не для страницы.

Как я могу это исправить, чтобы всплывающее окно оставалось, если оно недействительно, вместо того, чтобы отправлять обратно в представление создания?

Стоит ли просто забыть о всплывающих окнах и создать новую страницу для форм?Какова лучшая практика и наиболее практичное решение для PRG и форм?

Моя структура выглядит следующим образом:

Модель

 public class Subscribers
    {
        [Required(ErrorMessage="Name is required")]
        [Display(Name = "Subscriber Name: ")]
        public string Name { get; set; }

        [Required(ErrorMessage = " URI is required")]
        [Display(Name = "URI (email or url): ")]
        public string URI { get; set; }

        [Display(Name = "Channel: ")]
        [Required(ErrorMessage = " Channel is required")]
        public int SelectedChannelID { get; set; }

        [Display(Name = "Subscriber Type: ")]
        [Required(ErrorMessage = " Type is required")]
        public int? SelectedSubscriberTypeID { get; set; }

        public List<Models.Subscriber> getSubscribers()
        {

            Models.SwitchboardEntities db = new Models.SwitchboardEntities();
            List<Models.Subscriber> subscriberList = db.Subscribers.ToList();

            return subscriberList;
        }

Просмотр

Create.cshmtl

@model Switchboard.Models.Subscribers      
<script src="@Url.Content("~/Scripts/jquery-1.7.1.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

    @using (@Html.BeginForm("Create", "Subscriber", Model, FormMethod.Post, new { id = "addForm" }))
    {
    <fieldset>
    <legend><h3>Create</h3></legend>

    <br />
     @Html.ValidationSummary(true)
     <div class="editor-fields">
           @Html.LabelFor(xModels => xModels.Name)
           @Html.EditorFor(xModels => xModels.Name)
           @Html.ValidationMessageFor(xModels => xModels.Name)
     </div>
     <div class="editor-fields">
           @Html.LabelFor(xModels => xModels.URI)
           @Html.EditorFor(xModels => xModels.URI)
           @Html.ValidationMessageFor(xModels => xModels.URI)
     </div>
}

...

Контроллер

[HttpPost]
        public ActionResult Create(Models.Subscribers model)
        {
            try
            {
                // TODO: Add insert logic here
                if (ModelState.IsValid)
                {
                    return RedirectToAction("Index");
                }
                else
                {
                    return View(model);
                }
            }
            catch
            {
                return View(model);
            }
        }

Ответы [ 2 ]

1 голос
/ 01 марта 2012

Есть много вещей, которые вы делаете не совсем правильно. Во-первых, jQuery должен быть загружен в ваш файл макета (в разделе head), а не в вашем частичном представлении (я предполагаю, что Create.cshtml является частичным). jQuery должен быть загружен как можно раньше (и это должен быть первый загруженный скрипт), и он должен быть загружен до отображения страницы. Помещая это так далеко, вы просто напрашиваетесь на неприятности.

Я бы также добавил в макет jquery.validation и jquery.validation.unobtrusive.

Если бы вы могли это сделать, я бы скачал бета-версию MVC4 и сгенерировал интернет-приложение по умолчанию. Приложение MVC4 по умолчанию использует всплывающее диалоговое окно входа в систему, которое включает в себя проверку и не исчезает, если проверка не удалась .. именно то, что вы ищете. Вы должны быть в состоянии адаптировать их код к вашим собственным потребностям.

Также убедитесь, что у вас установлены последние версии jQuery.validation и jQuery.validation.unobtrusive. Используйте NuGet для получения последних версий всего.

0 голосов
/ 01 марта 2012

Вам нужно будет сохранить данные в объекте TempData, доступном как для контроллера, так и для представления (при необходимости), а затем извлечь их и использовать, если они есть, при следующем запросе.

public ActionResult Create(Models.Subscribers model) {
  // .. snip ..
  if (ModelState.IsValid) {
    return RedirectToAction("Index");
  }
  // .. snip ..
  this.TempData["SubscribersTemp"] = model;
  this.RedirectToAction("Index");
}

Это сохраняет модель в объекте TempData для следующего запроса и отправляет пользователя обратно к действию Index.Это действие может выполнять свою обычную процедуру, и как только оно достигнет строки @Html.RenderAction("RenderCreate"), новая логика получит временные данные и отправит их в представление.

public PartialViewResult RenderCreate() { // use name of partial view here
  // The next line will use the model from the TempData if it exists or
  // create a new, empty model if it does not.

  // Using the create method above as an example, if the model is valid,
  // the next line will create a new subscribers object to pass to the partial
  // view. If it was invalid, it'll use the object stored in TempData instead.
  Models.Subscribers model = 
      this.TempData["SubscribersTemp"] as Model.Subscribers ??
      new Model.Subscribers();

  return this.View(model);
}

Объект TempData сохранит данныетолько для следующего запроса .По завершении этого запроса объект TempData очищается.

...