2011-02-01 56 views
4

我使用ASP.NET MVC 3RedirectToAction替代

我wriiten一個輔助類,如下所示:

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

而在我的控制器代碼我用這樣的:

return RedirectToAction(Url.NewsList()); 

所以重定向後的鏈接地址如下:

../News/News/List 

是否有替代RedirectToAction?有沒有更好的方法來實現我的幫手方法NewsList?

回答

7

其實你並不真的需要一個幫手:

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

,或者如果你想避免硬編碼:

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

然後:

return RedirectToRoute(Url.NewsList()); 

或另一種可能性是使用MVCContrib,它允許你寫下(親自這就是我喜歡和使用的):

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

或者另一種可能性是使用T4 templates

所以這取決於你選擇和玩。


UPDATE:

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

然後:

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

更新2:

NewsList擴展方法的單元測試的實施例:

[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"]); 
} 
+0

@Darin:我想嘗試和消除儘可能多的硬編碼,這就是爲什麼我想創建一個輔助方法。是否有可能在像我以上嘗試的幫助方法中使用MVCContrib的方式? – 2011-02-02 07:16:52