2

嗨人们是 MVC3 和学习的新手,我想知道当用户添加游戏时是否可以允许用户在我的网站上检查游戏是否已经输入。我想要这个功能,所以我网站上的任何游戏玩家都无法对同一款游戏进行全面评论。原因是我有一个用户可以在其中谈论游戏的页面。所以这就是为什么我想要一种在添加新游戏时检查数据库的方法,如果游戏存在的话。

我的控制器如下:

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 查询在保存之前检查游戏是否存在。假设在我的示例中,字段名称足以识别您可以这样做的游戏评论

    [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

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 回答