MVC控制器动作超载

时间:2011-01-14 15:22:31

标签: asp.net-mvc controller

我能否以不会引发错误的方式做类似的事情:

public class AdsController : Controller
{
  AdsRepository repo = new AdsRepository();

  public ActionResult Details(string id)
  {
    AdSlots adslot = new AdSlots();
    Enum.TryParse(id, true, out adslot);
    return Content(repo.GetInvocationCode(adslot, Global.SiteInfo.ID));
  }

  [ChildActionOnly]
  public ActionResult Details(AdSlots slot)
  {
    return Content(repo.GetInvocationCode(slot, Global.SiteInfo.ID));
  }

}

关键是我希望有一种方法可以通过/ ads / details / leaderboard作为浏览器中的网址访问资源,也可以使用以下方式在母版页中访问:

 <% Html.RenderAction("Details", "Ads", new {slot = AdSlots.Leaderboard }); %>

我认为这比以前更清洁:

 <% Html.RenderAction("Details", "Ads", new {slot = "Leaderboard" }); %>

如果我按上述方式操作并调用url / ads / details / leaderboard,我会收到此错误:

  

当前关于控制器类型'AdsController'的操作'详细信息'请求在以下操作方法之间是不明确的..等等

我不认为我会得到该错误,因为我已将属性[ChildActionOnly]赋予其他操作。我认为系统显而易见的是,如果我通过浏览器访问它,我只会有一个选项,显然不是这样。

2 个答案:

答案 0 :(得分:2)

也许不是最好的,但是 <% Html.RenderAction("Details", "Ads", new {id = AdSlots.Leaderboard.ToString() }); %> 应该总是导致第一个动作......并且因为问题是MVC在你的枚举上调用ToString(),所以你可以完全忽略第二个控制器动作,然后你的问题可能会消失......解析枚举不是 昂贵......

答案 1 :(得分:0)

ChildActionOnlyAttribute仅强制您通过视图中的Html.ActionHtml.RenderAction将该操作作为子请求的一部分进行调用。当MVC尝试将方法与传入路由调用匹配时,不考虑此属性。