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.";
}
}
唯一の彼のデータを編集することができるユーザーとして、これは動作します:。
のようなアイデンティティを受信するIsUserEsistsアクション結果の署名を変更することを忘れないでください...おかげ –