Повторное использование частичного представления (ascx) для разных контроллеров и представлений - PullRequest
2 голосов
/ 01 ноября 2010

Предположим, у меня есть 2 контроллера, TopicsController и PostsController .

Для каждого контроллера у меня есть пара представлений (индекс и детали).

Тема (индекс) представление наследует System.Web.Mvc.ViewPage<IEnumerable<MessageBoard.Models.Topic>>

Тема (подробности) представлениенаследует System.Web.Mvc.ViewPage<MessageBoard.Models.TopicFormViewModel> Я использую TopicFormViewModel, потому что отправляю дополнительные данные вместе с моделью.

Представление (Подробности) просто наследует System.Web.Mvc.ViewPage<MessageBoard.Models.Post>

Теперь я создал частичное представление (CreatePost.ascx) , которое (очевидно: p) используется для создания новой публикации.Я хочу иметь возможность повторно использовать этот элемент управления для всех представлений, которые вы видите выше.

Обновление Я попытался отрисовать частичное представление, используя <% Html.RenderPartial("New"); %> из моего Topics / Index.aspx View, но это приводит к исключению

Элемент модели, переданный в словарь:типа 'System.Data.Linq.Table`1 [MessageBoard.Models.Topic]', но для этого словаря требуется элемент модели типа 'MessageBoard.Models.Post'.

Теперь проблемав том, что мое частичное представление (CreatePost.ascx) принимает System.Web.Mvc.ViewUserControl<MessageBoard.Models.Post>, и я не уверен, как передать это из всех моих представлений выше.

IЯ также не знаю, как отправить значения .ascx на определенный URL-адрес (т. е. / Topics / 1 / CreatePost), как сказать кнопке отправки опубликовать этот URL-адрес?

Заранее спасибо,Marko

Ответы [ 3 ]

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

Чао Марко,

Теперь проблема в том, что мой частичный view (CreatePost.ascx) принимает System.Web.Mvc.ViewUserControl и я не уверен, как передать это от все мои взгляды выше.

Я не уверен, что понимаю, что вы подразумеваете под " как передать это из всех моих представлений выше ", но я уверен, что вам не нужно передавать экземпляр Post из ваших представлений. Что происходит, так это то, что из ваших представлений вы вызываете действие контроллера, которое создает объект модели Post, а затем связываете его с частичным CreatePost.ascx.

Я также не знаю, как отправить Значения .ascx для определенного URL-адреса (т.е. / Topics / 1 / CreatePost), как мне сказать кнопку отправки для публикации на этот URL?

У вас есть два варианта:

Внутри вашей части CreatePost.ascx вы, вероятно, используете форму.

<% using (Html.BeginForm("action", "controller", FormMethod.Post, new {} )) { %>

Если вы используете способ, которым я показываю, вы можете изменить первый и второй параметры соответственно на имена Действие и Контроллер, которые будут мешать вашему представлению.

Второй вариант - использование jQuery. Просто установите идентификатор для вашей формы, а затем

$("#myForm").submit(function(event) {
    //post an ajax request to the server
});

Надеюсь, это поможет!

P.S. Чтобы иметь возможность многократно использовать ваш CreatePost.ascx, поместите его в папку общего доступа (где находится ваша главная страница).

0 голосов
/ 01 ноября 2010

@ Marko

Другим способом было бы иметь в PostController действие, подобное следующему:

[HttpGet]
public ActionResult CreatePost( int topicId ) {
    PostModel pm = _manager.CreateDefaultPost();
    pm.TopicID = id;
    return PartialView( "CreatePost", pm );
}

Затем, где бы вы ни захотели создать сообщение, вы можете просто вызвать это действие, которое возвращает строгое представление для вашего нового сообщения.

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

С точки зрения «точка зрения» вызов действия может быть выполнен, когда пользователь нажимает кнопку «Новая запись», а затем вводит полученную разметку в модальное диалоговое окно или в удобное для вас место в текущая страница.

Надеюсь, это поможет!

0 голосов
/ 01 ноября 2010

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

<% html.RenderPartial("~/Views/<ControllerName>/<PartialViewName>.ascx", <model>);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...