2011-02-14 48 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