捕获和解析AmbiguousMatchException

时间:2011-02-14 11:48:22

标签: asp.net-mvc-3

我想在抛出AmbiguousMatchException时捕获它,然后编写一些代码来解决它。例如,我有一个动作ChangePassword,只有在用户登录时才应该调用它。我有另一个方法RenewPassword,如果用户没有登录,必须调用它。我给这两个方法赋予了相同的动作名称。 / p>

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

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

我想使用相同的操作名称,因为我不希望视图必须担心要调用的操作。我知道我可以编写一个自定义FilterAttribute,它将执行与AuthorizeAttribute相反的操作,将其应用于RenewPassword方法,从而解决模糊性问题。然而,对于一个非常简单的需求来说,这似乎太过分了。

有更好的想法吗?是否有一种内置的方式来表示应该仅对匿名用户执行特定操作而对于已登录用户

1 个答案:

答案 0 :(得分: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)
{
    ...
}