ASP.NET MVC3 RAZOR: Redirecting from Partial Views
Solution 1
There are number of errors in you code:
- When calling child action
MyBlogs
from parent actionIndex
, having@using (Html.BeginForm())
in the MyBlogs view, generates the form that posts toIndex
action, not theMyBlogs
one. Same story forPopulars
. So, no suprise that every submit re-renders Index action contents - that is action requested by your form. Try using overload of Html.BeginForm that accepts route parameters. [ChildActionOnly]
means that action is not accessible by outside world, be request HttpGet, Post, by url or any other means. It can be used only withHtml.Action
helper. So, when you correct the 1st error, you won't be still able to post on that action. You should removeChildActionOnly
attribute if that action should handle post requests.- If it's the real code you posted, it does not (and should not) redirect. You should correct method signature and add missing
return
statement
This code
[HttpPost]
public void MyBlogs(string blogclick)
{
RedirectToAction("BlogHome");
}
Should be
[HttpPost]
public ActionResult MyBlogs(string blogclick)
{
return RedirectToAction("BlogHome");
}
This should work
Solution 2
The problem lies with @using (Html.BeginForm())
.
When we do not specify any action and controller name in BeginForm, It will post Data to the Url of the page. (In this scenario Article/Index ).
You can specify the Action and Controller to post the data,
Like, in MyBlogs.cshtml
@using(Html.BeginForm("MyBlogs","Article")){
...}
in MyPopular.cshtml
@using(Html.BeginForm("MyPopular","ThePopular")){
...}
Solution 3
well, not sure if it's the full story or not, but you have:
public string PoularHome()
{
return "Poular Home";
}
which is merely a method. you then issue (from your MyPopular
method):
RedirectToAction("PoularHome");
As PoularHome()
isn't returning a type of ActionResult
(or derivation), then the pipeline is going to ignore this 'request'. You need to seriously look at returning the appropriate type. Try refactoring your method (action) as such and see if it helps:
public ContentResult PoularHome()
{
return Content("Poular Home");
}
no guarantees - just a 30K feet observation.
LCJ
.Net / C#/ SQL Server Developer Some of my posts listed below -- http://stackoverflow.com/questions/3618380/log4net-does-not-write-the-log-file/14682889#14682889 http://stackoverflow.com/questions/11549943/datetime-field-overflow-with-ibm-data-server-client-v9-7fp5/14215249#14215249 http://stackoverflow.com/questions/12420314/one-wcf-service-two-clients-one-client-does-not-work/12425653#12425653 http://stackoverflow.com/questions/18014392/select-sql-server-database-size/25452709#25452709 http://stackoverflow.com/questions/22589245/difference-between-mvc-5-project-and-web-api-project/25036611#25036611 http://stackoverflow.com/questions/4511346/wsdl-whats-the-difference-between-binding-and-porttype/15408410#15408410 http://stackoverflow.com/questions/7530725/unrecognized-attribute-targetframework-note-that-attribute-names-are-case-sen/18351068#18351068 http://stackoverflow.com/questions/9470013/do-not-use-abstract-base-class-in-design-but-in-modeling-analysis http://stackoverflow.com/questions/11578374/entity-framework-4-0-how-to-see-sql-statements-for-savechanges-method http://stackoverflow.com/questions/14486733/how-to-check-whether-postback-caused-by-a-dynamic-link-button
Updated on June 04, 2022Comments
-
LCJ almost 2 years
I have two partial views “MyPopular” and “MyBlogs”. And there are two controllers – “ArticleController.cs” and “ThePopularController.cs”. Both these partialviews contains buttons.
Initially it renders both partial views inside the index view.
On post action handler for blog’s click, it is asked to redirect to “BlogHome“ action where it will return a simple string “Blog Home” (instead of a view). On post action handler for popular’s click, it is asked to redirect to “PopularHome“ action where it will return a simple string “Popular Home”. But currently, when I click on any of the button, it renders localhost:1988/Article index; without partial content.
Note: The result is same even when I used ContentResult and ActionResult. Note: Please highlight if I am going through the wrong way for achieving such a simple task.
How do we correct it to do the proper redirecting?
//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> }
//Blog Display Template
@model MyArticleSummaryTEST.Blog <li> <h3>@Html.DisplayFor(x => x.Head)</h3> @Html.DisplayFor(x => x.Content) </li>
READING:
Redirect to Refer on Partial View Form Post using ASP.NET MVC
Why are Redirect Results not allowed in Child Actions in Asp.net MVC 2
Redirecting from a Partial View the "Right" Way in ASP.Net MVC 2 http://geekswithblogs.net/DougLampe/archive/2011/08/05/redirecting-from-a-partial-view-the-right-way-in-asp.net.aspx
Partial Requests in ASP.NET MVC http://blog.stevensanderson.com/2008/10/14/partial-requests-in-aspnet-mvc/
Progressive enhancement tutorial with asp.net mvc 3 and jquery http://www.matthidinger.com/archive/2011/02/22/Progressive-enhancement-tutorial-with-ASP-NET-MVC-3-and-jQuery.aspx