2016-01-04 1 views
1

Прежде всего, я новичок в ASP.NET. Я пытаюсь создать судоку на веб-сайте, но у меня есть одна проблема.ASP.NET HomeController

Показывать поле sudoku с помощью метода HomeController -> ActionResult index();

В этом ActionResult я создаю новый SudokuField и покажу его на веб-сайте. Это работает.

Я также добавил @ Html.ActionLink в моем Index.cshtml так:

@Html.ActionLink("Cheat", "Index", new { @no = 2 })

Когда я нажимаю на «обмануть», он снова вызывает метод Index() из HomeController и дает номер 2 как параметр, отлично работает. Но поскольку метод Index() снова вызван, HomeController создает новый объект Sudoku. Поэтому я теряю текущее состояние GameField.

Мой вопрос: Есть ли решение, которое HomeController не будет создавать новый объект судоку.

Мой HomeController ->

SudokuBasis.Game myGame = new SudokuBasis.Game(); 
    Models.Sudoku s = new Models.Sudoku(); // Sudoku Object 

    public ActionResult Index(int? no) { 

     if (no == null) { 
      myGame.Create(); // creates all fields and add some value 
     } else if (no == 2) { 
      myGame.Cheat(); // fills all fields 
     } 

     s.MyFields = myGame.GameField(); 

     return View(s); 
    } 
+0

Каждый запрос создаст новый экземпляр контроллера, поэтому вам нужно будет переместить создание игры в действие. Вы можете хранить экземпляр sudoku в 'Session', тогда, когда вы обманываете, вы можете проверить, существует ли экземпляр, а не создавать новый. – Jasen

+0

Согласен с Джейсоном. Каждый запрос может обрабатываться разными потоками. Помещение экземпляра в ваш класс контроллера не гарантирует, что вы получите доступ к одному экземпляру (т. Е. Не потоковому безопасному). –

ответ

3

Каждый запрос будет создавать новый экземпляр контроллера, так что вы должны будете переместить создание игры в действии.

Вы можете сохранить экземпляр sudoku в Session, а затем, когда вы обманываете, вы можете проверить, существует ли экземпляр, а не создавать новый.

public ActionResult NewGame() 
{ 
    var game = new Game(); 
    Session["game"] = game; 
    return View(game); 
} 

public ActionResult Cheat() 
{ 
    if (Session["game"] == null) 
    { 
     return RedirectToAction("NewGame"); 
    } 
    var game = Session["game"] as Game; 
    return View(game); 
} 
Смежные вопросы