3

私は徹底的に検索しましたが、実際に直面しているシナリオに対処するものは何も見つかりません(奇妙なことに、それは非常に一般的なことだと思っていたからです)。

バックグラウンド

ASP.NET MVC 4 と Entity Framework 5 Code First でアプリケーションを作成しています。この質問の目的のために、投稿とユーザーを含むブログ アプリケーションと考えてください。

計画

投稿モデルでは、すべての投稿に対応する UserId が必要です。

ASP.NET MVC 4 メンバーシップを使用すると、ログインしているユーザーのユーザー名を簡単に見つけることができます

User.Identity.Name.

これは理想的ではありません。ID が必要ですが、このようなクエリを使用すると、データベースで名前を検索して ID を取得できます。

db.UserProfiles.Single(a => a.UserName == User.Identity.Name);

問題

投稿を作成しようとすると問題が発生します。Model.IsValidビューから UserId が渡されていないため、false です。明らかに、ユーザーは自分の ID を入力する必要がないためです。

ID 値をビューに入力ViewBagしてフィールドを使用しようとし@Html.Hidden()ましたが、成功しませんでした。Model.IsValid常に false を返します。

この情報は create ビューを介して入力する必要がありますか? または、コントローラーで直接行う必要がありますか?私は情報を持っていて、それをモデルに渡す方法を理解する必要があるだけなので、非常にイライラする問題です。

コントローラーコード

これは基本的に、デフォルトのスキャフォールディング コードです。コメントされたコードは、モデル値をコントローラーから直接設定しようとした方法ですが、それは試行錯誤に過ぎませんでした。

    //
    // POST: /Post/Create

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create(Post post)
    {
        if (ModelState.IsValid)
        {
            //var userId = db.UserProfiles.Single(a => a.UserName == User.Identity.Name);
            //post.User.UserId = userId.UserId;
            db.Posts.Add(post);
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(post);
    }
4

3 に答える 3

3

非表示フィールドには注意してください。誰でもそのフィールドに好きな値を入力できます (つまり、別のユーザーになりすますことができます)。ログイン時にセッションでIDをキャッシュし、その値を使用する方がよいでしょう。

于 2013-03-26T17:41:54.020 に答える
2

これは、EditModelビュー レイヤーとコントローラー レイヤーの間でデータ転送オブジェクト (DTO) として を作成する典型的なケースです。

BlogPostEditModel新しいブログ投稿を作成するときにユーザーが入力する必要があるすべてのプロパティを持つクラスを作成します。次に、このタイプを (たとえば AutoMapper を使用して)BlogPostエンティティにマップし、ユーザー ID も入力します。

などの組み込みの検証を使用するModel.IsValid()には、代わりにデータ注釈属性を DTO に配置します。

于 2013-03-26T17:41:56.133 に答える
2

正直なところ、コントローラーを介して値を割り当てることができます。誰かが Firebug を介して HTML をいじっていた場合、id が渡されてフォームに送信される前に、実際に id を変更することができます。Create ビューから削除し、コントローラーから送信します。

于 2013-03-26T17:42:41.083 に答える