ASP.NET MVC3 RAZOR: перенаправление из частичных представлений - PullRequest
3 голосов
/ 23 февраля 2012

У меня есть два частичных представления «MyPopular» и «MyBlogs».И есть два контроллера - «ArticleController.cs» и «ThePopularController.cs».Оба эти частичных просмотра содержат кнопки.

Изначально он отображает оба частичных представления в представлении индекса.

В обработчике пост-действия для клика в блоге его просят перенаправить на действие «BlogHome», где он вернет простую строку «Блог»Дом »(вместо вида).В обработчике пост-действия для клика популярного пользователя его просят перенаправить на действие «PopularHome», где он вернет простую строку «Популярный дом».Но в настоящее время, когда я нажимаю на любую кнопку, она отображает localhost: 1988 / Article index;без частичного содержимого.

Примечание. Результат одинаков, даже когда я использовал ContentResult и ActionResult.Примечание: пожалуйста, выделите, если я иду неправильным путем для решения такой простой задачи.

Как мы можем исправить это, чтобы сделать правильное перенаправление?

// ArticleController

public class ArticleController : Controller
{

    public ActionResult Index()
    {
        //Index returns no model
        return View();
    }

    public string BlogHome()
    {
        return "Blog Home";
    }


    //ChildActionOnly attribute indicates that this action should not be callable directly via the URL. 
    [ChildActionOnly]
    public ActionResult MyBlogs()
    {
        Thread.Sleep(500);
        return PartialView(GetAllBlogEntries());
    }

    [ChildActionOnly]
    [HttpPost]
    public void MyBlogs(string blogclick)
    {
        RedirectToAction("BlogHome");
    }


    private IEnumerable<Blog> GetAllBlogEntries()
    {
        return new[]
                    {
                        new Blog { ID = 1, Head = "Introduction to MVC", PostBy = "Lijo", Content = "This is a ..." },
                        new Blog { ID = 2, Head = "jQuery Hidden Gems", PostBy = "Lijo", Content = "This is a ..." },
                        new Blog { ID = 3, Head = "Webforms Intenals", PostBy = "Lijo", Content = "This is a ..." }
                    };
    }



}

// ThePopularController

public class ThePopularController : Controller
{

    public string PoularHome()
    {
        return "Poular Home";
    }


    //ChildActionOnly attribute indicates that this action should not be callable directly via the URL. 
    [ChildActionOnly]
    public ActionResult MyPopular()
    {
        Thread.Sleep(500);
        return PartialView(GetPopularBlogs());
    }


    [ChildActionOnly]
    [HttpPost]
    public void MyPopular(string popularpress)
    {
        RedirectToAction("PoularHome");
    }


    private IEnumerable<PopularTutorial> GetPopularBlogs()
    {
        return new[]
                    {
                        new PopularTutorial { ID = 17, Title = "Test1", NumberOfReads = 1050 },
                        new PopularTutorial { ID = 18, Title = "Test2", NumberOfReads = 5550 },
                        new PopularTutorial { ID = 19, Title = "Test3", NumberOfReads = 3338 },
                        new PopularTutorial { ID = 20, Title = "Test4", NumberOfReads = 3338 },
                        new PopularTutorial { ID = 21, Title = "Test5", NumberOfReads = 3338 },
                        new PopularTutorial { ID = 22, Title = "Test6", NumberOfReads = 3338 },
                        new PopularTutorial { ID = 23, Title = "Test7", NumberOfReads = 3338 },
                    };
    }
}

// Index.cshtml

All Blogs List
@Html.Action("myblogs")

<br />
<br />

Popular Tutorial
@Html.Action("mypopular","thepopular")

// MyPopular.cshtml

@model IEnumerable<MyArticleSummaryTEST.PopularTutorial>

@{
var grid = new WebGrid(Model, canPage: true, canSort: false, rowsPerPage: 3);
}

@grid.GetHtml(
            columns: grid.Columns(grid.Column("", format: @<text>@item.Title</text>))
        )


@using (Html.BeginForm())
{
<div>
    <input type="submit" name ="popularpress" id="2"/>  
</div>
}

// MyBlogs.cshtml

@model IEnumerable<MyArticleSummaryTEST.Blog>

<section>
<ul>
    @Html.DisplayForModel()
</ul>
</section>

@using (Html.BeginForm())
{
<div>
<input type="submit" name ="blogclick" id="1"/>  
</div>
}

// Шаблон блога

@model MyArticleSummaryTEST.Blog

<li>
<h3>@Html.DisplayFor(x => x.Head)</h3>
@Html.DisplayFor(x => x.Content)
</li>

ЧТЕНИЕ:

  1. asp.net Действие контроллера частичного просмотра MVC

  2. Использование Html.BeginForm для публикации в текущем контроллере

  3. Загрузка частичного представления в jquery.Диалог

  4. Как я могу генерировать HTML в действии из частичного просмотра?

  5. Возврат перенаправленияили PartialView из того же действия

  6. Перенаправление для ссылки на форму частичного просмотра сообщения с использованием ASP.NET MVC

  7. Почему результаты перенаправления не разрешеныДочерние действия в Asp.net MVC 2

  8. ValidationSummary не отображается с частичными представлениями

  9. Перенаправлениес частичной точки зрения «правильный» путь в ASP.Net MVC 2 http://geekswithblogs.net/DougLampe/archive/2011/08/05/redirecting-from-a-partial-view-the-right-way-in-asp.net.aspx

  10. Частичные запросы в ASP.NET MVC http://blog.stevensanderson.com/2008/10/14/partial-requests-in-aspnet-mvc/

  11. Руководство по прогрессивному расширению сasp.net MVC 3 и JQuery http://www.matthidinger.com/archive/2011/02/22/Progressive-enhancement-tutorial-with-ASP-NET-MVC-3-and-jQuery.aspx

Ответы [ 4 ]

4 голосов
/ 23 февраля 2012

В вашем коде число ошибок:

  1. При вызове дочернего действия MyBlogs из родительского действия Index, имеющего @using (Html.BeginForm()) в представлении MyBlogs, генерируется форма, которая отправляет действие Index, , а не MyBlogs one . Та же история для Populars. Таким образом, не удивительно, что каждая отправка повторно отображает содержимое действия Index - это действие, запрошенное вашей формой. Попробуйте использовать перегрузку Html.BeginForm, которая принимает параметры маршрута.
  2. [ChildActionOnly] означает, что действие недоступно внешнему миру, запрашивайте HttpGet, Post, URL или любым другим способом. Может использоваться только с помощником Html.Action. Поэтому, когда вы исправите 1-ю ошибку, вы все равно не сможете публиковать сообщения об этом действии. Вам следует удалить атрибут ChildActionOnly, если это действие должно обрабатывать почтовые запросы.
  3. Если вы отправили реальный код, он не (и не должен) перенаправлять. Вы должны исправить сигнатуру метода и добавить пропущенную return инструкцию

Этот код

[HttpPost]
public void MyBlogs(string blogclick)
{
    RedirectToAction("BlogHome");
}

Должно быть

[HttpPost]
public ActionResult MyBlogs(string blogclick)
{
    return RedirectToAction("BlogHome");
}

Это должно работать

3 голосов
/ 23 февраля 2012

Проблема заключается в @using (Html.BeginForm()).

Когда мы не указываем никакое действие и имя контроллера в BeginForm, он будет публиковать данные на URL страницы.(В этом сценарии Article / Index).

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

Например, в MyBlogs.cshtml

@using(Html.BeginForm("MyBlogs","Article")){
...}

в MyPopular..cshtml

@using(Html.BeginForm("MyPopular","ThePopular")){
...}
1 голос
/ 23 февраля 2012

ну, не уверен, что это полная история или нет, но у вас есть:

public string PoularHome()
{
    return "Poular Home";
}

, что является всего лишь методом.затем вы выдаете (из вашего MyPopular метода):

RedirectToAction("PoularHome");

Поскольку PoularHome() не возвращает тип ActionResult (или деривацию), тогда конвейер будет игнорировать этот 'запрос».Вы должны серьезно посмотреть на возвращение соответствующего типа.Попробуйте рефакторинг вашего метода (действия) как такового и посмотрите, поможет ли это:

public ContentResult PoularHome()
{
    return Content("Poular Home");
}

без гарантий - только наблюдение на 30 тыс. Футов.

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

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

Также вам необходимо вернуть RedirectToAction.Это все еще тип ActionResult, который должен быть возвращен.

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