1

ユーザーが自分のプロファイルの詳細を変更できるようにしたい(UserId、Username、password(別のビューでパスワードが変更された)を除く)

だから私の方法でそれをそのようにするとき

    public void SaveUser(UserProfile user)
    {
        context.Entry(user).State = System.Data.EntityState.Modified;
        context.SaveChanges();
    }

ストアの更新、挿入、または削除ステートメントが予期しない行数(0)に影響するというエラーが発生します。その後、誰かが別の方法でそれを作ることを提案したスタックオーバーフローをサーフィンしたので、SaveUserメソッドを編集しました

        public void SaveUser(UserProfile user)
     {
        var objectContext = ((System.Data.Entity.Infrastructure.IObjectContextAdapter
                   )context).ObjectContext;
        try
        {
            objectContext.SaveChanges();
        }
        catch (OptimisticConcurrencyException)
        {
            objectContext.Refresh(RefreshMode.ClientWins, context.UserProfiles);
            objectContext.SaveChanges();
        }
     }

これらの変更後、このエラーは発生しなくなりましたが、プロファイルの詳細は変更されていません。

私のHttpPostEditメソッド(HttpGetは正しい情報を取得します)

[HttpPost]
    public ActionResult Edit(UserProfile user)
    {
        if (ModelState.IsValid)
        {
            repository.SaveUser(user);
            return View(user);
        }
        return View();
    }

編集ビューには、すべて(ID、ユーザー名、パスワードを除く)のLabelForとEditorForと[送信]ボタンしかありません。

それを一日中解決しようとしていて、まだ成功していません。

4

1 に答える 1

2

ほとんどの場合、ユーザーの主キーUserIdプロパティ値は、ビューで0を使用していないためですUserId0次に、データベースに存在しないキー値でエンティティを更新しようとしているため、例外が発生します。

UserIdクライアントとサーバーの間でユーザーを行き来させる非表示のフォームフィールドをビューに配置します。

@Html.HiddenFor(model => model.UserId)

通常、デフォルトのルーティングを使用する場合は、ルートが必要ですhttp://www.mysite.com/{controller}/{action}/{id}。URLがの場合、 MVCは値を名前の付いたプロパティhttp://www.mysite.com/User/Edit/3にバインドしようとします(大文字または小文字は関係ありません)。その後、アップデートが機能するはずです。しかし、の主キープロパティはではなく、他の何か-のようなものだと思います。その場合、モデルバインダーはキープロパティを見つけることができず、その値をデフォルト(= )のままにします。3idUserIdUserId0

したがって、非表示フィールドの代わりに、ユーザーのキープロパティに名前を付けるIdか、パラメーターとして使用するルートを特殊化することUserIdができます。

于 2012-11-14T20:08:55.850 に答える