2011-01-17 4 views
0

私はこれがちょっとばかげてしまうと私には正に説明する方法がわからない厄介な小さなバグがあります。また、オブジェクトの保護のために名前が変更されました;)カスタムフィルターで不要なモデルをバインドする

私が取り組んでいるMVCサイト(私はまだそれをやっていませんでした)は、アクションにパラメータを挿入するカスタムフィルタ属性を持っています前記フィルタで装飾された方法。このパラメータには、ロールベースの権限を決定するために使用されるログインユーザの詳細が格納されます。以下の例を参照してください。

[UserFilter] 
public ActionResult DoSomeStuffDependingOnPrivileges(string userId, UserObj user) 

UserObjはモデルです。それは少し次のようになります。

public class User 
{ 
    [DisplayName("User ID")] 
    public int UserID { get; set; } 

    ... 
    ... 
    ... 

    public IEnumerable<RoleModels.Role> Roles { get; set; } 
} 

ここでは、カスタムアクションフィルターです:

public override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    if (filterContext.ActionParameters.ContainsKey(key)) 
    { 
     if (filterContext.HttpContext.User.Identity.IsAuthenticated) 
     { 
      var user = (User)filterContext.HttpContext.Session["User"]; 
      filterContext.ActionParameters[key] = user; 
     } 
    } 

    base.OnActionExecuting(filterContext); 
} 

だから、それが動作する方法は、フィルタがセッション格納されている値からUserObjパラメータを移入ということです。アクションメソッドを呼び出すコードでは渡されません。私が推測する考えは、コードやそのような崇高な意図を一掃したり集中させたりすることでした。

奇妙なことはこれです:アクションメソッドを見てください。 userIdという名前の文字列パラメータを渡しています。このuserIdは、UserObjパラメーターにあるユーザーとは異なるユーザーのIDです(マネージャーの従業員関係と考える)。アクションフィルタが実行されると、必要に応じてユーザパラメータが設定されますが、何らかの理由で、そのユーザパレメータのUserIDプロパティ(int)にactionメソッドに渡されるuserIdパラメータ(string)が設定されます。 UserObjモデルの検証は望んでいませんでした。

なぜラリーですか?

回避策は簡単です。 userIdパラメータの名前を変更すると問題が解決されます。

私の質問(最終的にはこれです):どのようにして、アクションメソッドのパラメータ名を変更せずに、これをやめるのですか?

答えて

1

お使いになりましたか?BindAttribute

+0

こんにちはヤクブにアクションメソッドUserObjパラメータを変更し、ノー私はそうではありません。このインスタンスではどのように動作しますか?私はMVCにはかなり新しいので、たくさんの短い単語や例が役に立ちます;) – WernerVA

0

ありがとうJakub。

BindAttributeを追加すると、そのトリックが実行されました。

私は

public ActionResult DoSomeStuffDependingOnPrivileges(string userId, [Bind(Exclude = "userId")] UserObj user)

関連する問題