2010-04-24 48 views
1

我可以重寫ActionResult方法嗎?說我有這樣的重寫方法asp.net mvc

公衆的ActionResult指數(){

返回視圖()中的AccountController的方法指數; }

我可以有相同的名字,但有不同的充參數 像 公衆的ActionResult指數(INT用戶id){

返回查看()多了一個方法; }

我不想這樣稱呼它http://something/accounts/index/11 我只想說http://something/accounts/11

你可以看一下計算器的東西也 如果你去https://stackoverflow.com/users 我覺得用戶是控制器和默認的動作是所以不要將其稱爲顯式。 現在如果你鍵入類似https://stackoverflow.com/users/96346/parminder 這兩個參數是96346和parminder

我希望它是有道理的。

這將是在Global.asax

關於條目 成員Parminder

回答

0

看看我的問題here

我想你可以通過一些黑客攻擊方法的屬性做到這一點,但我認爲如果你編寫另一種方法,然後添加一條路線,它會更清潔。它看起來像這樣:

public ActionResult Index() 
{ 
    return View(); 
} 

public ActionResult UserInfo(int id) 
{ 
    //some stuff 
    return View(modelObject); 
} 

然後你提供一個路由,它想:

routes.MapRoute("UserInfo", //route name 
       "Accounts/{id}", 
       new 
       { 
        controller = "Accounts", 
        action = "UserInfo", 
        id=UrlParameter.Optional 
       }); 
+0

嗨Narsil, 感謝您的回答。我試着用這種方法。但我不能打電話給我的方法,像這樣http:// something/accounts/1 它沒有這樣工作。是的,如果我寫http:// accounts/userinfo/1 謝謝 – Parminder 2010-04-24 17:20:49

+0

如果您正確映射路徑,可以直接從accounts/3調用您的方法。你能發佈你的Global.asax嗎? – 2010-04-24 20:05:05

+0

嗨Narsil, 我刪除了默認路由。這裏是我的global.asax routes.IgnoreRoute(「{resource} .axd/{* pathInfo}」); routes.MapRoute( 「的UserInfo」,//路由名稱 「用戶/ {ID}/{名稱}」, 新 { 控制器= 「用戶」, 行動= 「的UserInfo」, ID = UrlParameter.Optional, name = UrlParameter.Optional }); 這裏是控制器方法 公衆的ActionResult的UserInfo(INT ID,字符串的名字嗎?) { 返回查看(); } 它現在有效 謝謝 – Parminder 2010-04-25 03:15:51

0

你想高估負載的方法。但你不需要。

就使參數可空:

public ActionResult Index(int? userid) 
{ 
    return (userid.HasValue) ? ShowUser(userid.Value) : ShowOverview(); 
} 

你可以把這個例子的默認路線圖。

對於您的(更改)需求,您確實需要使用約束來修改您的路線。

routes.MapRoute("directaccount", "Accounts/{userid}/{someotherparam}", 
    new { controller="Accounts", action="ShowAccountByID", someotherparam=null } 
    new { [email protected]"\d+"}); 

*here goes the rest* 

reg-ex確保您的其他呼叫不會被此路由所吞噬。這是未經測試的。我不建議爲此功能使用重載。

+0

嗨Wikser, 非常感謝您的回答。默認索引的作品,但當我必須通過我不得不說的http:// something/accounts/index/1 這些參數我不想做。 Regards – Parminder 2010-04-24 17:22:37

1

您可以執行操作重載(兩個在同一個控制器上具有不同參數的同名操作),但它們應該可以在不同的HTTP動詞上調用。這是ASP中的一種常見模式。NET MVC應用程序:通過GET訪問一個動作呈現含有一種形式和第二種作用,這種形式將發佈一個觀點:

public class HomeController: Controller 
{ 
    public ActionResult Index() 
    { 
     return View(); 
    } 

    [HttpPost] // [AcceptVerbs(HttpVerbs.Post)] for ASP.NET MVC 1.0 
    public ActionResult Index(SomeViewModel model) 
    { 
     if (ModelState.IsValid) 
     { 
      // TODO: validation passed => do something with the model 
     } 
     return RedirectToAction("index"); 
    } 
} 

有沒有需要修改你的路由對於這一點,它的工作原理與缺省。

+0

謝謝達林, 我知道這個東西。但需求是不同的。 問候 – Parminder 2010-04-24 17:33:38