Многоразовые компоненты в ASP.NET MVC - PullRequest
1 голос
/ 10 ноября 2010

У меня есть функция на моем веб-сайте (некоторые пользовательский интерфейс и связанные с ней функции), которую я хочу использовать на нескольких страницах.Для целей этого вопроса, скажем, это функция «Комментарии».

В моем приложении есть область для Компонентов, а внутри области - контроллер: /Controllers/CommentController и два частичных представления: /Views/Comment/Index.ascx (для отображения комментариев) и /Views/Comment/Create.ascx(для создания комментариев).

CommentController выглядит примерно так:

public class CommentController : Controller
{      
  [ChildActionOnly]
  public ActionResult Index()
  {
      return PartialView(GetComments());
  }

  [HttpGet]
  [ChildActionOnly]
  public ActionResult Create()
  {
      return PartialView(); //this is wrong.
  }

  [HttpPost]
  [ChildActionOnly]
  public ActionResult Create(FormCollection formValues)
  {
      SaveComment(formValues);

      return RedirectToAction("Index"); //this is wrong too.
  }
}

Частичное представление индекса:

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

<div>
  <% foreach (var item in Model) { %>    
      <div>
          <%: item.Comment %>
      </div>
  <% } %>

  <%: Html.ActionLink("Add a Comment", "Create", "Comment", new { area = "Components" }, null) %>
</div>

Создание частичного представления:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<dynamic>" %>
<div>
    <% using (Html.BeginForm())
       {%>
        Enter your comment:
        <div>
            <input type="text" name="comment" />
        </div>
        <p>
            <input type="submit" value="Create" />
            <% //also render a cancel button and redirect to "Index" view  %>
        </p>
    <% } %>
</div>

Частичное индексированиепредставление включается в представление с помощью RenderAction, например так:

<% Html.RenderAction("Index", "Comment", new { area = "Components" }); %>

Этот код не работает, поскольку формы в частичных представлениях подчиняются действиям на контроллере CommentsController, помеченным [ChildActionOnly] (этоЯ не хочу, чтобы «Компоненты» запрашивались независимо от страницы хостинга).

Как я могу заставить работать этот «компонентный» подход, то есть иметь частичное представление, которое отправляет форму для изменения состояния компонента на странице без потери самой страницы хостинга?

РЕДАКТИРОВАТЬ: Чтобы уточнить, использование [ChildActionOnly] не моя проблема здесь.Если я удаляю атрибут из моих методов действия, мой код только «работает» в том смысле, что он не выдает исключение.Мой «компонент» по-прежнему выпадает из своей страницы хостинга при отправке формы (потому что я говорю, чтобы форма отправлялась по URL-адресу частичного представления!).

Ответы [ 2 ]

3 голосов
/ 10 ноября 2010

Вы заставляете MVC бороться с самим собой, запрашивая у формы действие, помеченное как ChildActionOnly.

Мое решение этой проблемы, когда я проектировал среду мастера с возможностью многократного использования, заключалось в том, чтобы НЕ отмечать действияas ChildActionOnly, но вместо этого, чтобы определить, является ли запрос ajax-запросом или просто обычным ванильным запросом.

Код для всего этого упакован в базовый класс контроллера.В ваших производных контроллерах вы делаете что-то вроде:

[WizardStep(4, "Illness Details")]
public ActionResult IllnessDetails()
{            
    return Navigate();
}

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

Чтобы выяснить, является ли это запросом Ajax, я использовал комбинацию Request.IsAjaxRequest () и TempData.TempData необходим, потому что моя среда мастера реализует шаблон PRG из коробки, поэтому мне нужно сохранить тот факт, что исходное сообщение было ajax.

Я думаю, это только одно решение, и оно занялонемного проб и ошибок, чтобы понять это правильно.Но теперь я живу долго и счастливо, развивая волшебников, как я был Дж. К. Роулинг ...

1 голос
/ 10 ноября 2010

Используйте Ajax для публикации частичного.

...