'C# MVC partial view only updates after another button is pressed
So I'm pretty new to C# MVC, so I've been trying to recreate the game minesweeper into a web app for practice. I've been creating right and left click actions, and when I left click, my gameboard updates on click, but when I right-click to place a flag, it doesn't display the flag until another button is pressed. It's really confusing to me that one works but not the other. I've also been using AJAX for my page updates.
-Controller-
using Microsoft.AspNetCore.Mvc;
using MineSweeper.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace MineSweeper.Controllers
{
public class GameBoardController : Controller
{
static List<ButtonModel> buttons = new List<ButtonModel>();
Random random = new Random();
const int GRID_SIZE = 100;
public IActionResult Index()
{
if (buttons.Count < GRID_SIZE)
{
for (int i = 0; i < GRID_SIZE; i++)
{
buttons.Add(new ButtonModel(i));
}
}
return View(buttons);
}
public IActionResult HandleButtonClick(string buttonNumber)
{
int bn = int.Parse(buttonNumber);
if (buttons.ElementAt(bn).enabled == true)
{
buttons.ElementAt(bn).visited = true;
}
return View("Index", buttons);
}
public IActionResult ShowOneButton(int buttonNumber)
{
return PartialView(buttons.ElementAt(buttonNumber));
}
public IActionResult RightClickShowButton(int buttonNumber)
{
flagSwap(buttonNumber);
return PartialView("ShowOneButton", buttons.ElementAt(buttonNumber));
}
public void flagSwap(int buttonNumber)
{
if (buttons.ElementAt(buttonNumber).flag == false)
{
buttons.ElementAt(buttonNumber).flag = true;
buttons.ElementAt(buttonNumber).enabled = false;
} else
{
buttons.ElementAt(buttonNumber).flag = false;
buttons.ElementAt(buttonNumber).enabled = true;
}
}
}
}
-Game Board Page-
@model IEnumerable<MineSweeper.Models.ButtonModel>
<style>
.game-button {
width: 74px;
height: 74px;
text-align: center;
}
.game-button-image {
width: 70%;
}
.button-zone {
display: flex;
flex-wrap: wrap;
}
.line-break {
flex-basis: 100%;
height: 0;
}
</style>
<br />
<form>
<div class="button-zone">
@for (int i = 0; i < Model.Count(); i++)
{
if (i % 5 == 0)
{
<div class="line-break"></div>
}
if (Model.ElementAt(i).enabled == true)
{
<button class="game-button" name="buttonNumber" value="@Model.ElementAt(i).id" type="submit" asp-controller="GameBoard" asp-action="HandleButtonClick">
@if (Model.ElementAt(i).visited == true)
{
<img class="game-button-image" src="~/img/BlueB.png" />
}
else if (Model.ElementAt(i).flag == true)
{
<img class="game-button-image" src="~/img/Flag.png" />
Model.ElementAt(i).enabled = false;
}
else
{
<img class="game-button-image" src="~/img/ButtonImg.jpg" />
}
</button>
}
else
{
<button class="game-button" name="buttonNumber" value="@Model.ElementAt(i).id">
@if (Model.ElementAt(i).visited == true)
{
<img class="game-button-image" src="~/img/BlueB.png" />
}
else if (Model.ElementAt(i).flag == true)
{
<img class="game-button-image" src="~/img/Flag.png" />
Model.ElementAt(i).enabled = false;
}
else
{
<img class="game-button-image" src="~/img/ButtonImg.jpg" />
}
</button>
}
}
</div>
</form>
-Button Partial View-
@model MineSweeper.Models.ButtonModel
<button class="game-button" name="buttonNumber" value="@Model.id" type="submit" asp-controller="GameBoard" asp-action="HandleButtonClick">
@if (Model.flag == true)
{
<img class="game-button-image" src="~/img/Flag.png" />
Model.enabled = false;
} else
{
<img class="game-button-image" src="~/img/ButtonImg.png" />
}
</button>
-Site.js file-
$(function () {
console.log("Page is ready");
$(document).bind("contextmenu", function (e) {
e.preventDefault();
console.log("Right click. Prevent context menu from showing.")
});
$(document).on("mousedown", ".game-button", function (event) {
switch (event.which) {
case 1:
event.preventDefault();
var buttonNumber = $(this).val();
console.log("Button number " + buttonNumber + " was left clicked");
doButtonUpdate(buttonNumber, "/GameBoard/ShowOneButton");
case 2:
break;
case 3:
event.preventDefault();
var buttonNumber = $(this).val();
console.log("Button number " + buttonNumber + " was right clicked");
doButtonUpdate(buttonNumber, "/GameBoard/RightClickShowButton");
break;
default:
alert('Nothing');
}
});
function doButtonUpdate(buttonNumber, urlString) {
$.ajax({
datatype: "json",
method: 'POST',
url: urlString,
data: {
"buttonNumber": buttonNumber
},
success: function (data) {
console.log(data);
$("#" + buttonNumber).html(data);
}
});
}
});
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|
