Связывание 2d массива в ASP.NET MVC - PullRequest
3 голосов
/ 06 мая 2019

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

Сгенерированный HTML

Модель

public class Matrix
{
    public int[,] Numbers { get; set; }
}

View @modelProject.Models.Matrix

@{
   var options = new AjaxOptions()
   {
    UpdateTargetId = "Matrix",
    };
}

@using (Ajax.BeginForm("Form", "Home", FormMethod.Post, options))
 {
 <div id="Matrix"> </div>
 <input type="submit" value="Rotate" name="ButtonType" />
  }

частичное представление

@model int[,]
@if (Model != null && Model.Length > 0)
{
<table id="numbers-container">
    @for (int column = 0; column < Model.GetLength(0); column++)
    {
        <tr>
            @for (int row = 0; row < Model.GetLength(1); row++)
            {
                var Numbers= Model[column, row];
                @Html.TextBoxFor(m => Numbers, new { id = $"{column}_{row}" })
            }
        </tr>
    }
</table>
 }

контроллер

   [HttpPost]
    public ActionResult SubmitForm(Matrix model, string ButtonType)

Если я добавлю некоторое простое свойство, оно будет заполнено в модели, но в массиверавно нулю, MVC не хочет связывать его, потому что идентификаторы и имена в сгенерированном html одинаковы. Как изменить его, чтобы получить заполненный массив из формы в контроллере?Нужна помощь

Ответы [ 2 ]

2 голосов
/ 06 мая 2019

Я попытался воспроизвести код, я изменил отображение в файле cshtml, все заработало

в коде CS

public class Matrix
    {
        public int[][] Numbers { get; set; }
    }

    public class MatrixController : Controller
    {
        // GET: Matrix
        public ActionResult Index()
        {

            int col = 2, row = 2;
            var matrix = new Matrix();
            matrix.Numbers = new int[col][];
            for (int i = 0; i < col; i++)
                matrix.Numbers[i] = new int[row];

            return View(matrix);
        }

        [HttpPost]
        public ActionResult SubmitForm(Matrix matrix, string ButtonType)
        {
            return null;
        }
    }

In cshtml

@model WebApplication1.Controllers.Matrix
@{
    var options = new AjaxOptions()
    {
        UpdateTargetId = "Matrix",
    };
}

@using (Ajax.BeginForm("SubmitForm", "Matrix", FormMethod.Post, options))
{
    <div id="Matrix">
        @if (Model != null && Model.Numbers.Length > 0)
        {
            <table id="numbers-container">
                @for (int column = 0; column < Model.Numbers.Length; column++)
                {
                    <tr>
                        @for (int row = 0; row < Model.Numbers[column].Length; row++)
                        {

                            @Html.EditorFor(x => Model.Numbers[column][row])
                        }
                    </tr>
                }
            </table>
        }
    </div>
    <input type="submit" value="Rotate" name="ButtonType" />
}
1 голос
/ 06 мая 2019

Имя свойства Numbers в классе Matrix. Но имя HTML-тега: « число », что не соответствует свойству модели. Они должны соответствовать для привязки модели по умолчанию к автоматической привязке. Свойство target модели должно быть одномерным массивом.

Вы можете изменить коды следующим образом:

Модель:

public class Matrix
{
    public int[] SelectedNumbers { get; set; }
    public int[,] Numbers { get; set; }
}

Cshtml:

@Html.TextBoxFor(m => Numbers, new { id = $"{column}_{row}", name="Numbers" })

В контроллере вы получите выбранные значения в model.Numbers

К вашему сведению - вы не должны иметь одинаковый идентификатор, назначенный нескольким элементам. Вы можете иметь то же имя, но разные идентификаторы. Присвойте идентификатор, связав номер строки с именем.

...