Несколько действий на представление, состоящее из частичных представлений, привязанных к моделям - PullRequest
0 голосов
/ 29 февраля 2012

Расширение до: Как вы обрабатываете несколько кнопок отправки в ASP.NET MVC Framework?

Допустим, представление состоит из частичных представлений, связанных ссвязанные модели, скажем, студент должен предоставить несколько контактных лиц (частичное представление привязано к модели Person) и несколько контактных номеров (частичное представление привязано к модели), чтобы зарегистрироваться, извините за плохой пример.После добавления контактного лица или номера вызывается действие (дочерний постбэк или что-то еще), которое проверяет связанную модель (не модель студента), добавляет ее в список и возвращает на ту же страницу для дальнейшей обработки.После того как все добавлено, действие родителя / мастера проверяет всю модель ученика и обрабатывает ее.

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

Ответы [ 2 ]

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

Это решение использует # 2 (Session), поскольку его проще кодировать, однако это демонстрирует принципы.

Представления

Представление индекса:

@using StackOverflow.Models

    <div>

    @{ Html.RenderPartial("PersonGrid", Model.Persons, new ViewDataDictionary()); }
    @Html.Partial("NewPerson", new Person())
    @{ Html.RenderPartial("ContactGrid", Model.Contacts, new ViewDataDictionary()); }
    @Html.Partial("NewContact", new Contact())

    @using(Html.BeginForm("Validate", "Home", FormMethod.Post))
    {
        <input type="submit" value="Validate" />
    }
    </div>

Персональная Сетка


    @model IList

    <table>
        <thead>
            <tr>
                <td>First Name</td>
                <td>Last Name</td>
            </tr>
        </thead>

        <tbody>
            @if (Model != null && Model.Any())
            {
                foreach (var person in Model)
                {
                    <tr>
                        <td>@person.FirstName</td>
                        <td>@person.LastName</td>
                    </tr>
                }
            }
            else
            {
                <tr>
                    <td colspan="2" style="text-align: center">No persons available</td>
                </tr>
            }
        </tbody>
    </table>

Контактная Сетка


    @model IList

    <table>
        <thead>
            <tr>
                <td>Phone</td>
            </tr>
        </thead>
        <tbody>
            @if (Model != null && Model.Any())
            {
                foreach (var contact in Model)
                {
                    <tr>
                        <td>@contact.Phone</td>
                    </tr>
                }
            }
            else
            {
                <tr>
                    <td>No contacts available</td>
                </tr>
            }
        </tbody>
    </table>

Новый Персона


    @model StackOverflow.Models.Person


    @using (Html.BeginForm("NewPerson", "Home", FormMethod.Post))
    {
        <div>
            @Html.Hidden("PersonViewState", TempData["PersonViewState"])

            @Html.LabelFor(m => m.FirstName)<br />
            @Html.TextBoxFor(m => m.FirstName)<br />

            <br />

            @Html.LabelFor(m => m.LastName)<br />
            @Html.TextBoxFor(m => m.LastName)<br />

            <br />
            <input type="submit" value="Submit" />
        </div>
    }

Новый Контакт


    @model StackOverflow.Models.Contact

    @using (Html.BeginForm("NewContact", "Home", FormMethod.Post))
    {
        <div>
            @Html.LabelFor(m => m.Phone)<br />
            @Html.TextBoxFor(m => m.Phone)<br />
            <br />
            <input type="submit" value="Submit" />
        </div>
    }

Модели



    public class Person
    {
        [Display(Name = "First Name")]
        public string FirstName { get; set; }

        [Display(Name = "Last Name")]
        public string LastName { get; set; }
    }

    public class Contact
    {
        [Display(Name = "Phone")]
        public string Phone { get; set; }
    }

    public class HomeModel
    {
        public IList<Person> Persons { get; set; }
        public IList<Contact> Contacts { get; set; }
    }

Помощники



    public static class PersistenceMechanism
    {
        public static IList GetPersons()
        {
            return (IList<Person>) HttpContext.Current.Session["__Persons"];
        }

        public static IList GetContacts()
        {
            return (IList<Contact>) HttpContext.Current.Session["__Contacts"];
        }

        public static void Update(IList<Person> persons)
        {
            HttpContext.Current.Session["__Persons"] = persons;
        }

        public static void Update(IList<Contact> contacts)
        {
            HttpContext.Current.Session["__Contacts"] = contacts;
        }
    }

Контроллер



    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            var model = new HomeModel
                            {
                                Persons = PersistenceMechanism.GetPersons(),
                                Contacts = PersistenceMechanism.GetContacts()
                            };
            return View(model);
        }

        [HttpGet]
        public ActionResult PersonGrid()
        {
            var persons = PersistenceMechanism.GetPersons();

            return PartialView(persons);
        }

        [HttpGet]
        public ActionResult ContactGrid()
        {
            var contacts = PersistenceMechanism.GetContacts();

            return PartialView(contacts);
        }

        [HttpPost]
        public ActionResult NewPerson(Person model)
        {
            var persons = PersistenceMechanism.GetPersons() ?? new List<Person>();
            persons.Add(model);
            PersistenceMechanism.Update(persons);

            return RedirectToAction("Index");
        }

        [HttpPost]
        public ActionResult NewContact(Contact model)
        {
            var contacts = PersistenceMechanism.GetContacts() ?? new List<Contact>();
            contacts.Add(model);
            PersistenceMechanism.Update(contacts);
            return RedirectToAction("Index");
        }

        [HttpPost]
        public ActionResult Validate()
        {
            var persons = PersistenceMechanism.GetPersons();
            var contacts = PersistenceMechanism.GetContacts();

            // validate
            // ...

            return RedirectToAction("Index");
        }
    }

0 голосов
/ 29 февраля 2012

Повторите вопрос, чтобы убедиться, что у меня есть представление о том, что вы спрашиваете.

Страница вашей страницы построена из двух частичных представлений с разными моделями.Оба эти частичных представления содержат форму, которая при отправке создает сетку записей в пользовательском интерфейсе.На главной странице будет дополнительная кнопка подтверждения, которая затем будет проверять все содержимое обеих сеток при обратной передаче?

В этой ситуации мне хотелось бы иметь две формы, в которых событие submit работает на Ajax.Либо jQuery / Microsoft Ajax.Обе формы будут представлены для двух отдельных действий, которые будут принимать их соответствующие модели, Персона и Контакт.Каждая кнопка отправки возвращает свой частичный вид, который будет сеткой, показывающей коллекцию элементов, которые были отправлены до сих пор.Возвращенное частичное представление обновит указанную цель (например, div), так как мы используем AJAX.

Конечно, необходимо будет запомнить предыдущие элементы, которые были отправлены до сих пор, чтобы восстановить сетку с новым элементом.добавлено.Это будет означать, что требуется некоторое мягкое постоянное хранение.Доступны следующие варианты:

  1. База данных
  2. Сессия
  3. Скрытые поля формы (предпочтительно).Можно использовать механизм привязки модели массива для поддержки этого или простого сериализованного объекта (или списка объектов) в одном скрытом поле.

Проверка теперь становится простой, поскольку модель доступна на стороне серверачерез механизм постоянного хранения при обратной передаче.

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