[英]Why can't Asp.net MVC distinguish between two actions when they have different parameters?
我試圖在我的Asp.net MVC應用程序中有兩種不同的帳戶注冊方法,一種用於一般用戶注冊,另一種用於注冊特定注冊令牌的用戶。 因此,我的AccountController
有以下方法簽名:
public virtual ActionResult Register () {...}
public virtual ActionResult Register (Guid registrationToken) {...}
但是,當我轉到http://localhost/Account/Register
我得到一個異常,即當前請求在這兩個操作之間是不明確的。 我的印象是,如果沒有傳入registrationToken
GET參數,它將使用無參數的Register
操作,否則它將使用2nd。
這需要特殊的路由配置嗎?
使用可為空參數的方法會更容易嗎? 這也將自動解決您的問題,因為它不再模棱兩可:
public virtual ActionResult Register (Guid? registrationToken)
{
if(registrationToken.HasValue)
{
// this is specific user
}
else
{
// this is general user
}
}
對於mvc控制器的默認基類, Controller
使用ActionInvoker來選擇要調用的操作。 第一動作被選擇時,默認情況下從的RouteData [“行動”]的值,然后所有的模型綁定和驗證為發生所選擇的動作的參數。 這就是為什么當調用者看到兩個具有相同名稱和相同屬性的動作進行選擇時,它會觸發錯誤,因為它無法區分兩者。
但是有內置的方法來管理動作選擇邏輯,即使用從ActionMethodSelector類派生的屬性。 首先,創建從中派生的類,其中包含用於調用操作的邏輯。 在你的情況下
如果沒有傳入registrationToken GET參數,它將使用無參數的Register操作,否則它將使用2nd。
public class RegistrationActionTokenAttribute : ActionMethodSelectorAttribute
{
public override bool IsValidForRequest(ControllerContext controllerContext, System.Reflection.MethodInfo methodInfo)
{
if (controllerContext.HttpContext.Request.QueryString.AllKeys.Contains("registrationToken"))
{
return true;
}
return false;
}
}
我實現了演示邏輯,如果querystring包含參數“registrationToken”,則第二個操作應標記為有效以供選擇。 剩下的東西是用這個屬性裝飾你的第二個方法
[RegistrationActionToken]
public virtual ActionResult Register (Guid registrationToken) {...}
錯誤消失了。 此外,控制器現在根據查詢字符串參數選擇正確的操作
第二種方法是否需要Post? 將[HttpPost]添加到將用於接受表單提交的任何方法之上通常是有益的。
它也可以解決你的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.