2011-02-14 9 views
2

ASP.NET MVC3でリモート属性を使用すると予期せぬ事態に陥ります。asp.net mvcのリモート属性 - 状況によってはモデルが制限される

私が使用したモデルタイプ:

using System; 
using System.Web.Mvc; 
using System.ComponentModel.DataAnnotations; 

namespace dTweets.Models 
{ 
    // at first time, user should create his account with unique username 
    // as in twitter.com, user do 
    public class UserMetadata 
    { 
     [HiddenInput] 
     internal int Identity { get; set; } 


     [Remote("IsUserExist", "Account")] // at any HttpPost, username should 
              // be unique – not appropriate if 
              // updating/editing this model later 

     [Required(ErrorMessage = "username should be unique")] 
     public string UserName { get; set; } // user cannot change it, later 


     [DataType(DataType.Password)] 
     public string Password { get; set; } // user can also change password, later 


     [DataType(DataType.MultilineText)] 
     public string About { get; set; } // Optional field – user can edit it later 
    } 

    [MetadataType(typeof(UserMetadata))] 
    [Bind(Include="UserName, Password, About")] 
    public partial class User 
    { 
    } 
} 

リモート属性は、アカウント作成時にユーザー固有の名前を検証します。しかし、後でユーザーが自分のアカウントを更新/変更しようとするとき、リモート属性では、ユーザーの一意の名前を同じに保つとモデルを更新できませんでした。

ほとんどの場合、ユーザーが一意のユーザー名を変更しないため、これは適切な結果ではありません。 [フィールドやパスワードについて]などの他のフィールドを変更するだけです。

[注::アカウント作成時に、ここではリモート属性を使用したが、後でユーザーアカウントを更新するときにユーザー固有の名前を確認したいリモート属性]

このモデルを後で更新するにはリモート属性を削除する必要があります。

このモデルを更新するには、ユーザー固有の名前を変更しないでこのモデルを更新してください(この一意の名前にリモート属性が適用されています)。彼がログインしているので、限り、あなたは現在のユーザーを持っている

public ActionResult IsUserExists(string userName) 
{ 
    if (!UserService.UserNameExists(userName) || (CurrentUser.UserName == userName)) 
    { 
      return "Yeah. Is it valid."; 
    } 
} 

唯一の彼のデータを編集することができるユーザーとして、これは動作します:。

答えて

1

は、あなただけのようなものに、サーバー側の検証方法を変更することはできません。

+1

のようなアイデンティティを受信するIsUserEsistsアクション結果の署名を変更することを忘れないでください...おかげ –

1

バディのメタデータが不足している場所の1つです。

シナリオを編集/追加するには、独自のビューモデルが必要です。すべてのシナリオ検証属性に適合する1つのサイズは、非常に些細なビジネスCRUDアプリケーションでのみ機能します。 AddとEditアクションは全く異なるコンテキストで行われ、過渡的にしか関連しません。この概念は、DDD限定コンテキストの考え方に非常によく似ています。これを行うには

+0

非常に本当。 2つのビューモデルを作成するだけです – Korayem

6

一つの方法は、

[Remote("IsUserExist", "Account",AdditionalFields = "Identity")] 

のようにパラメータの名前AdditionalFieldsにこのレコードのID値を送信すると、あなたは、現在のユーザーに属しているものを除き、すべての行全体で一意性を確認することができます。そして、ここでいいですね.....(CurrentUser.UserName == userNameに){...}場合

public ActionResutl IsUserExists(string UserName, int Identity) 
{ 

} 
関連する問題