2011-02-14 52 views
0

我想在抛出AmbiguousMatchException时抛出它,然后编写一些代码来解决它。例如,我有一个操作ChangePassword,只有当用户登录时才应该调用它。我有另一个方法RenewPassword,如果用户没有登录,则必须调用它。我已经为这两个方法提供了相同的操作名称。捕获并解析AmbiguousMatchException

[HttpPost] 
    [ActionName("ChangePassword")] 
    public ActionResult RenewPassword(ChangePasswordModel model) 
    { 
     ... 
    } 

    [Authorize] 
    [HttpPost] 
    [ActionName("ChangePassword")] 
    public ActionResult ChangePassword(ChangePasswordModel model) 
    { 
     ... 
    } 

我想使用相同的动作名称,因为我不想让视图不必担心要调用哪个动作。我知道我可以编写一个自定义的FilterAttribute,它将完成AuthorizeAttribute所做的相反操作,将其应用于RenewPassword方法,从而解决歧义问题。但是,这对于一个非常简单的需求来说似乎太多了。

有什么更好的点子?有没有内建的方式可以说只对匿名用户执行特定操作,对于登录用户而言,不是

回答

0

如果你不看法不必担心哪个动作调用为什么不写一个可重复使用的HTML帮助:

public static class HtmlExtensions 
{ 
    public static MvcForm BeginChangePasswordForm(this HtmlHelper htmlHelper) 
    { 
     if (htmlHelper.ViewContext.HttpContext.User.Identity.IsAuthenticated) 
     { 
      return htmlHelper.BeginForm("ChangePassword", "SomeController"); 
     } 
     return htmlHelper.BeginForm("RenewPassword", "SomeController"); 
    } 
} 

和您的视图中:

@using (Html.BeginChangePasswordForm()) 
{ 
    ... 
} 

,并在相应的控制器:

[HttpPost] 
public ActionResult RenewPassword(ChangePasswordModel model) 
{ 
    ... 
} 

[Authorize] 
[HttpPost] 
public ActionResult ChangePassword(ChangePasswordModel model) 
{ 
    ... 
} 
+1

好的建议。这确实需要额外的助手,这与额外的FilterAttribute一样麻烦。我希望有一个基于优先权的歧义解决机制。在不明确的情况下,应该选择最高优先级的匹配。 – 2011-02-15 04:02:57