Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

RedirectToAction alternative

I'm using ASP.NET MVC 3.

I've wriiten a helper class as follows:

public static string NewsList(this UrlHelper helper)
{
     return helper.Action("List", "News");
}

And in my controller code I use it like this:

return RedirectToAction(Url.NewsList());

So after the redirect the link looks like this:

../News/News/List

Is there an alternative to RedirectToAction? Is there a better way that I need to implement my helper method NewsList?

like image 514
Brendan Vogt Avatar asked Feb 26 '23 05:02

Brendan Vogt


1 Answers

Actually you don't really need a helper:

return RedirectToAction("List", "News");

or if you want to avoid hardcoding:

public static object NewsList(this UrlHelper helper)
{
     return new { action = "List", controller = "News" };
}

and then:

return RedirectToRoute(Url.NewsList());

or another possibility is to use MVCContrib which allows you to write the following (personally that's what I like and use):

return this.RedirectToAction<NewsController>(x => x.List());

or yet another possibility is to use T4 templates.

So it's up to you to choose and play.


UPDATE:

public static class ControllerExtensions
{
    public static RedirectToRouteResult RedirectToNewsList(this Controller controller)
    {
        return controller.RedirectToAction<NewsController>(x => x.List());
    }
}

and then:

public ActionResult Foo()
{
    return this.RedirectToNewsList();
}

UPDATE 2:

Example of unit test for the NewsList extension method:

[TestMethod]
public void NewsList_Should_Construct_Route_Values_For_The_List_Action_On_The_News_Controller()
{
    // act
    var actual = UrlExtensions.NewsList(null);

    // assert
    var routes = new RouteValueDictionary(actual);
    Assert.AreEqual("List", routes["action"]);
    Assert.AreEqual("News", routes["controller"]);
}
like image 166
Darin Dimitrov Avatar answered Mar 06 '23 22:03

Darin Dimitrov