2

こんにちは、MVC3 を初めて使用し、学習しています。ユーザーがゲームを追加するときに、私の Web サイトでユーザーがゲームが既に入力されているかどうかを確認できるようにすることは可能でしょうか。私のウェブサイトのゲーマーが同じゲームの全体的なレビューを書くことができないように、この機能が必要です。この理由は、ユーザーがゲームについて話すことができるページがあります。そのため、新しいゲームを追加するときに、ゲームが存在する場合にデータベースをチェックする方法が必要です。

私のコントローラーは次のとおりです。

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using PagedList;
using System.Web;
using System.Web.Mvc;
using System.IO;
using Test.Models;

namespace Test.Controllers
{ 
    public class GameController : Controller
    {
        private gamezoneDBEntities db = new gamezoneDBEntities();

        //
        // GET: /Game/


        public ViewResult Index(string Ordering, string WordFilter, string DisplaySearchResults, int? CounterForPage)
        {

            {
                var Info = db.tblGames.Include(x => x.tblConsole);

            }

            var Games = from b in db.tblGames
            .Where(U => U.UserName == User.Identity.Name)
                        select b;


            switch (Ordering)
            {
                case "HeadlineName":
                    Games = Games.OrderBy(b => b.GameName);
                    break;
                case "DatePosted":
                    Games = Games.OrderBy(b => b.ReleaseYear);
                    break;
                case "DiscriptionDate":
                    Games = Games.OrderBy(b => b.ReleaseYear);
                    break;
                default:
                    Games = Games.OrderByDescending(b => b.ReleaseYear);
                    break;
            }

            int pageSize = 3;
            int pageNumber = (CounterForPage ?? 1);
            var PageNumberResults = Games.ToPagedList(pageNumber, pageSize);
            ViewBag.PageNumberResults = Games.Count();
            if (PageNumberResults.Any())
            {
                return View(PageNumberResults);
            }

            return View("Error");
        }


        [HttpPost]
        public ActionResult Create(tblGame tblgame,
           HttpPostedFileBase image1,
           HttpPostedFileBase image2)
        {
            try
            {
                if (ModelState.IsValid)
                {

                    if (image1 != null)
                    {
                        string image = image1.FileName;
                        tblgame.Image = image;
                        var image1Path = Path.Combine(Server.MapPath("~/Content/UploadImages"), image);
                        image1.SaveAs(image1Path);
                    }

                    if (image2 != null)
                    {

                        string Image2 = image2.FileName;
                        tblgame.Image2 = Image2;
                        var image2Path = Path.Combine(Server.MapPath("~/Content/UploadImages"), Image2);
                        image2.SaveAs(image2Path);
                    }
                    db.tblGames.Add(tblgame);
                    db.SaveChanges();
                    return RedirectToAction("Index");
                }
                ViewBag.ConsoleNameIDFK = new SelectList(db.tblConsoles, "ConsoleName", "ConsoleName", tblgame.ConsoleNameIDFK);
                return View(tblgame);
            }
            catch
            {
                return View("Upload_Image_Failed");
            }

        }

        //
        // GET: /Game/Create

        public ActionResult Create()
        {

            ViewBag.ConsoleNameIDFK = new SelectList(db.tblConsoles, "ConsoleName", "ConsoleName");
            return View(new tblGame { UserName = @User.Identity.Name });

        } 



        public ViewResult Details(int id)
        {
            tblGame tblgame = db.tblGames.Find(id);
            return View(tblgame);
        }


        //
        // GET: /Game/Edit/5

        public ActionResult Edit(int id)
        { 
                tblGame tblgame = db.tblGames.Single(i => i.GameID == id);
                ViewBag.ConsoleNameIDFK = tblgame.ConsoleNameIDFK;
                return View(tblgame);
            }


        [HttpPost]
        public ActionResult Edit(tblGame tblgame, HttpPostedFileBase Image, int id,
            HttpPostedFileBase image2)
        {
            if (ModelState.IsValid)
            {


                if (Image != null)
                {
                    string image = Image.FileName;
                    tblgame.Image = image;
                    var image1Path = Path.Combine(Server.MapPath("~/Content/UploadImages"), image);
                    Image.SaveAs(image1Path);
                }

                if (image2 != null)

                {

                    string Image2 = image2.FileName;
                    tblgame.Image2 = Image2;
                    var image2Path = Path.Combine(Server.MapPath("~/Content/UploadImages"), Image2);
                    image2.SaveAs(image2Path);
                }

                db.tblGames.Attach(tblgame);
                db.Entry(tblgame).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Edit");
            }

            ViewBag.ConsoleNameIDFK = new SelectList(db.tblConsoles, "ConsoleName", "ConsoleName", tblgame.ConsoleNameIDFK);
            return View(tblgame);
        }



        //
        // GET: /Game/Delete/5

        public ActionResult Delete(int id)
        {
            tblGame tblgame = db.tblGames.Find(id);
            return View(tblgame);
        }

        //
        // POST: /Game/Delete/5

        [HttpPost, ActionName("Delete")]
        public ActionResult DeleteConfirmed(int id)

        {
            try
            {

                tblGame tblgame = db.tblGames.Find(id);
                db.tblGames.Remove(tblgame);
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            catch
            {
                return View("Error");

            }
        }  


        protected override void Dispose(bool disposing)
        {
            db.Dispose();
            base.Dispose(disposing);
        }
    }
}

ユーザーをユニークにするコードがあるため、ゲームがいつでも存在するかどうかを確認するのに非常に苦労しました。このコードが必要です。それ以外の場合は、すべてのゲームのデータベースをチェックし、このコードを含むゲームが存在する場合はエラーをスローするステートメントを作成できたはずです。追加したのは少し難しいため、ここに来ました。

コントローラーに以下を追加しました。

[HttpPost]
public ActionResult Create(tblGame tblgame, HttpPostedFileBase image1, HttpPostedFileBase image2)
{
    try
    {
        if (ModelState.IsValid)
        {
            var mygame = db.tblGames.Where(x => x.GameName == tblgame.GameName).SingleOrDefault();
            if (mygame != null)
            {
                if (image1 != null)
                                {
                                    string image = image1.FileName;
                                    tblgame.Image = image;
                                    var image1Path = Path.Combine(Server.MapPath("~/Content/UploadImages"), image);
                                    image1.SaveAs(image1Path);
                                }

                                if (image2 != null)
                                {

                                    string Image2 = image2.FileName;
                                    tblgame.Image2 = Image2;
                                    var image2Path = Path.Combine(Server.MapPath("~/Content/UploadImages"), Image2);
                                    image2.SaveAs(image2Path);
                                }
                                db.tblGames.Add(tblgame);
                                db.SaveChanges();
                                return RedirectToAction("Index");
            }
            else
            {
                //otherwise we add a generic error to the model state
                ModelState.AddModelError("", "A game review already exists");
            }
        }
    }
    catch
    {
        return View("Upload_Image_Failed");
    }
    //if arrive here the model is returned back to the view with the errors added
    return View(tblgame);
}
4

3 に答える 3

3

Linq クエリを使用して、保存する前にゲームが存在するかどうかを確認できます。私の例では、フィールド Name は、そのようにできるゲームレビューを識別するのに十分であると仮定します

    [HttpPost]
    public ActionResult Create(tblGame tblgame, HttpPostedFileBase image1, HttpPostedFileBase image2)
    {
        try
        {
            if (ModelState.IsValid)
            {
              var mygame = db.tblGames.Where(x => x.GameName == tblgame.GameName).SingleOrDefault();
              if (mygame != null)
              {
                if (image1 != null)
                {
                  string image = image1.FileName;
                  tblgame.Image = image;
                  var image1Path = Path.Combine(Server.MapPath("~/Content/UploadImages"), image);
                  image1.SaveAs(image1Path);
                }
                if (image2 != null)
                {
                  string Image2 = image2.FileName;
                  tblgame.Image2 = Image2;
                  var image2Path = Path.Combine(Server.MapPath("~/Content/UploadImages"), Image2);
                  image2.SaveAs(image2Path);
                }
                db.tblGames.Add(tblgame);
                db.SaveChanges();
                //All ok, we redirect to index or to Edit method. (PRG pattern)
                return RedirectToAction("Index");
              }
              else
              {
                //otherwise we add a generic error to the model state
                ModelState.AddModelError("", "A game review already exists");
              }
            }
        }
        catch
        {
          //return View("Upload_Image_Failed");
          ModelState.AddModelError("", "The upload of the images as failed");
        }
        //if we arrive here, the model is returned back to the view with the errors added
        ViewBag.ConsoleNameIDFK = new SelectList(db.tblConsoles, "ConsoleName", "ConsoleName", tblgame.ConsoleNameIDFK);
        return View(tblgame);
    }
于 2012-04-14T15:35:03.450 に答える
1

Create提供したコードから、アクションメソッドを変更する必要があります。

[HttpPost]
public ActionResult Create(tblGame tblgame, // tblGame is the new game being created
       HttpPostedFileBase image1,
       HttpPostedFileBase image2)
{
    try
    {
        if (ModelState.IsValid)
        {
             /* Go to DB and check if there's a Game already there that matches this
                one just being added. What's the property you want to check against?
                That's something you must provide. I just wrote GameName to show you
                how to do this... */
             var game = db.tblGames.Single(g => g.GameName == tblGame.GameName);

             /* OK, can proceed adding this game... since there's no game in the DB
                that matches this one being added. */
             if (game == null)
             {
                // Continue saving the new game
             }
             else /* Abort and display a message to user informing that there's a game
                  already. */
             {
                // TODO
             }
        }
    }
}
于 2012-04-14T15:33:39.890 に答える
0

ユーザーをユニークにするコードを持っているので、ゲームが終日存在するかどうかを確認するのに非常に苦労しました。このコードが必要です。そうでない場合は、すべてのゲームのデータベースをチェックし、このコードが存在するゲームが存在する場合はエラーをスローするステートメントがあった可能性があります。少し難しい追加をしたので、ここに来ました。

各ユーザーが独自のゲームリストを持っている場合、各ユーザーをゲームにマップするこのようなGameMappingというテーブルがあります。

ID | UserID | GameID

IDは、自動インクリメントされた主キーです。UserIDは、ユーザーのプライマリIDにリンクする外部キーであり、GameIDは、特定のゲームにリンクする外部キーです。

var user = GetUser(); // not sure what you use to identity users, but that logic would go here
var game = Db.Games.Where(g => g.Name == tblGame.Name).First();

Db.GameMapping
   .Where(g => g.UserID == user.ID) // filter out all records for that user
   .Select(g => g.GameID) // select just the game IDs
   .Contains(game.ID) // see if the game id they want to add is in that list

これは、同じチェックを行う代替のLINQクエリです。

if (Db.GameMapping.Where(gm => gm.UserID == User.ID && gm.GameID == game.ID).Count() > 0)
     // user already has that game
else
     // they do not 

プロジェクトの成長によりエラーが発生し始め、少し圧倒されるようになっているようです。このゲームチェックコードをプロジェクトに実装する前に強くお勧めするのは、最初に小さな単体テストをセットアップすることです。大きなプロジェクトとは別に新しいプロジェクトを作成し、データベースライブラリを追加して、ゲームとユーザーを入力する非常に小さなテストを作成し、このコードが期待どおりに機能するかどうかを確認します。実装がしっかりしていることがわかったら、それをより大きなプロジェクトに統合します。

プロジェクトを細かく分割して各部分をテストすると、全体のデバッグの複雑さが大幅に軽減されます。幸運を。

于 2012-04-14T17:07:21.687 に答える