asp.net mvc: как правильно вернуть html из контроллера для обновления списка выбора? - PullRequest
1 голос
/ 30 марта 2010

Я новичок в ASP.NET MVC, особенно в операциях ajax. У меня есть форма с JQuery диалог для добавления элементов в раскрывающийся список. Это сообщение для действия контроллера.

Если из действия Controller не возвращается ничего (т. Е. Метод void), страница возвращается после обновления базы данных, но очевидно, что в форме нет изменений. Что было бы лучшим способом обновления выпадающего списка с добавленным идентификатором / значением и выбора элемента. Я думаю, что мои варианты:

1) Создайте и верните HTML вручную, который составляет новый тег <select> [это было бы достаточно легко и сработало, но, похоже, я что-то упустил]

2) Используйте своего рода «помощник» для создания нового HTML [Кажется, это имеет смысл]

3) Вернуть только идентификатор / значение, добавить его в список и выбрать элемент [Это похоже на излишество, учитывая, что предмет должен быть размещен в правильном порядке и т. Д.]

4) Использовать какое-то частичное представление [Означает ли это создание дополнительных форм в элементах управления ascx? Не знаете, как это повлияет на отправку основной формы? Кроме того, если это не может быть повторно использовано путем передачи параметров (не уверен, как это сделано), возможно, 2 вариант?]

UPDATE:

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

Ответы [ 3 ]

1 голос
/ 30 марта 2010

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

Если это так, то я думаю, что лучший чистый и логичный вариант - вернуть JSON-сериализацию элементов, которые будут помещены в раскрывающийся список сразу после обновления базы данных. Затем, используя jQuery, вы очистите выпадающий список и добавите в него теги option.

Вы также можете написать новое отдельное действие, которое возвращает сериализацию JSON нужных вам объектов базы данных. Вы бы хотели, чтобы jQuery вызывал другой пост к этому действию в качестве обратного вызова к вашему первому посту ajax (тот, который использовался для обновления базы данных).

Вот быстрый фрагмент

public ActionResult UpdateDatabase(string something)
{
     /// update the database
     IEnumerable<Items> items = getItemsFromDatabase(); // or w/e
     var vals = items.Select(x=> new { value = x.ID, text = x.Name }); // something similar

      return Json(vals);
} 

Лично я написал бы отдельную функцию, которая возвращает JSON. Это обеспечивает разделение интересов и дает мне функцию, которую я могу использовать в самых разных местах.

1 голос
/ 30 марта 2010

посмотрите на ContentResult, вы можете указать тип mime того, что вы возвращаете (text / html) В качестве альтернативы вы можете создать элемент управления, который возьмет IEnumerable из всего, что вы поместили в список выбора, и соберет его с помощью механизма представления. Таким образом вы сохраняете форматирование html (в данном случае списка опций) в виде, а не в своем коде.

<%@ Control Language="C#"Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<Article>>"%>

<%foreach (var article in Model){%>
    <option><%:article.Title %></option>
<%} %>

Я думаю, что пошел бы на второй

0 голосов
/ 30 марта 2010

Возвращение JsonResult со всеми элементами является наиболее универсальным и требующим минимальной полосы пропускания решением, если вы готовы перебирать список в jQuery и обновлять раскрывающийся список.

Использование частичного представления удобно для HTML, так как вы можете загружать (...) непосредственно в ваш выбор, но менее универсально.

Я бы пошел с JsonResult.

В вашем контроллере:

public JsonResult UpdateItem(string sItem)
{
    // 1. Insert new item into database if not exist...
    // {update code here}

    // 2. retrieve items from database:
    IEnumerable<Item> Items = GetItems();

    // 3. return enumerable list in JSON format:
    return new JsonResult{ Data = new {Items = Items, Result = "OK" }};
}

На стороне клиента:

Итерация по массиву Items и добавление элементов в список.

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