关于c#:ASP.NET MVC3 RAZOR:从部分视图重定向

ASP.NET MVC3 RAZOR: Redirecting from Partial Views

我有两个部分视图"MyPopular"和"MyBlogs"。并且有两个控制器 -"ArticleController.cs"和"ThePopularController.cs"。这两个部分视图都包含按钮。

最初它在索引视图中呈现两个部分视图。

在博客点击的帖子操作处理程序上,要求它重定向到"BlogHome"操作,它将返回一个简单的字符串"Blog Home"(而不是视图)。在热门点击的帖子动作处理程序中,它被要求重定向到"PopularHome"动作,它将返回一个简单的字符串"Popular Home"。但是目前,当我点击任何一个按钮时,它会呈现localhost:1988 / Article索引;没有部分内容。

注意:即使我使用ContentResult和ActionResult,结果也是一样的。
注意:请强调我是否正在通过错误的方式来完成这么简单的任务。

我们如何纠正它以进行适当的重定向?

// ArticleController

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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

1
2
3
4
5
6
7
8
All Blogs List
@Html.Action("myblogs")

<br />
<br />

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

//MyPopular.cshtml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@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())
{

    <input type="submit" name ="popularpress" id="2"/>  

}

//MyBlogs.cshtml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@model IEnumerable<MyArticleSummaryTEST.Blog>

<section>

<ul>

    @Html.DisplayForModel()

</ul>

</section>

@using (Html.BeginForm())
{

<input type="submit" name ="blogclick" id="1"/>  

}

//博客显示模板

1
2
3
4
5
6
7
8
9
@model MyArticleSummaryTEST.Blog


<li>

@Html.DisplayFor(x => x.Head)
@Html.DisplayFor(x => x.Content)

</li>

读:

  • asp.net MVC局部视图控制器动作

  • 使用Html.BeginForm发布到当前控制器

  • 在jquery.dialog中加载局部视图

  • 如何从局部视图生成html?

  • 从同一个Action返回Redirect或PartialView

  • 重定向使用ASP.NET MVC引用部分视图表单帖子

  • 为什么在Asp.net MVC 2中的子操作中不允许重定向结果

  • ValidationSummary不会出现在部分视图中

  • 从部分方向重定向查看ASP.Net MVC 2中的"正确"方式
    http://geekswithblogs.net/DougLampe/archive/2011/08/05/redirecting-from-a-partial-view-the-right-way-in-asp.net.aspx

  • ASP.NET MVC中的部分请求
    http://blog.stevensanderson.com/2008/10/14/partial-requests-in-aspnet-mvc/

  • asp.net mvc 3和jquery的渐进增强教程
    http://www.matthidinger.com/archive/2011/02/22/Progressive-enhancement-tutorial-with-ASP-NET-MVC-3-and-jQuery.aspx


  • 您的代码中存在多个错误:

  • 从父动作Index调用子动作MyBlogs时,在MyBlogs视图中有@using (Html.BeginForm()),生成发布到Index动作的表单,而不是MyBlogs动作。 Populars的相同故事。因此,并不是每个提交重新呈现索引操作内容的惊喜 - 这是您的表单请求的操作。尝试使用接受路由参数的Html.BeginForm重载。
  • [ChildActionOnly]表示外界无法访问操作,请求HttpGet,Post,url或任何其他方式。它只能与Html.Action帮助程序一起使用。因此,当您更正第一个错误时,您仍然无法发布该操作。如果该操作应处理发布请求,则应删除ChildActionOnly属性。
  • 如果它是您发布的真实代码,则不会(也不应该)重定向。您应该更正方法签名并添加缺少的return语句
  • 这段代码

    1
    2
    3
    4
    5
    [HttpPost]
    public void MyBlogs(string blogclick)
    {
        RedirectToAction("BlogHome");
    }

    应该

    1
    2
    3
    4
    5
    [HttpPost]
    public ActionResult MyBlogs(string blogclick)
    {
        return RedirectToAction("BlogHome");
    }

    这应该工作


    问题在于@using (Html.BeginForm())

    当我们在BeginForm中没有指定任何操作和控制器名称时,它会将数据发布到页面的URL。 (在此场景文章/索引中)。

    您可以指定Action和Controller来发布数据,

    就像在MyBlogs.cshtml中一样

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

    在MyPopular.cshtml中

    1
    2
    @using(Html.BeginForm("MyPopular","ThePopular")){
    ...}


    好吧,不确定这是不是完整的故事,但你有:

    1
    2
    3
    4
    public string PoularHome()
    {
        return"Poular Home";
    }

    这只是一种方法。然后你发出(从你的MyPopular方法):

    1
    RedirectToAction("PoularHome");

    由于PoularHome()未返回ActionResult(或派生)类型,因此管道将忽略此"请求"。你需要认真看看返回合适的类型。尝试重构您的方法(操作),看看它是否有帮助:

    1
    2
    3
    4
    public ContentResult PoularHome()
    {
        return Content("Poular Home");
    }

    没有保证 - 只需30K英尺的观察。


    通过您的代码,您似乎正在重定向到不在当前控制器中的操作。如果操作不在当前控制器中,则需要使用指定控制器和操作的重载。否则它只会进入默认路由并将您发送到索引。

    您还需要返回RedirectToAction。这仍然是一种必须返回的ActionResult。