Как передать данные из View в Controller, когда View был создан объектом отражения? - PullRequest
0 голосов
/ 03 апреля 2020

Среда:

ASP. NET Ядро MVC 3.1 и библиотека. NET Стандарт

Цели:

  1. Создание объекта из DLL (dll может быть изменена в любой момент) без постоянной структуры, напр. класс Obj {int, string, string}, но другой dll будет иметь класс Obj {int, int, int}.

  2. Передать этот объект для просмотра.

  3. Создайте один «ящик формы», не зная, какими свойствами обладает объект. ех. string => textbox, bool => checkbox et c.

  4. Передать эти данные в метод / контроллер / API.

Моя проблема:

В этот момент я могу получить первые три очка, но не могу передать данные в контроллер. Я попытался отладить его, но метод Index (int x, int y) всегда вызывается с параметрами x = 0, y = 0.

Код:

HomeController.cs

    [HttpGet]
    public IActionResult Index()
    {
        Assembly dllAssembly = Assembly.LoadFile(Environment.CurrentDirectory + 
                                                 "\\TestLib.dll");
        Type dllType = dllAssembly.GetType("TestLib.TestModel");
        tempObj = Activator.CreateInstance(dllType);

        ViewBag.Message = tempObj;
        return View();
    }
    [HttpPost]
    public IActionResult Index(int x, int y)
    {
        Assembly dllAssembly = Assembly.LoadFile(Environment.CurrentDirectory + 
                                                 "\\TestLib.dll");
        Type dllType = dllAssembly.GetType("TestLib.TestModel");
        tempObj = Activator.CreateInstance(dllType);

        dllType.GetProperty("X").SetValue(tempObj, x);
        dllType.GetProperty("Y").SetValue(tempObj, y);

        ViewBag.Message = tempObj;
        return View();
    }

TestModel.cs

public class TestModel
{
    [Range(0, 10)]
    public int X { get; set; }
    [Range(0, 10)]
    public int Y { get; set; }
}

Index.cs html

@{
    ViewData["Title"] = "Home Page";
    var data = ViewBag.Message;
}

@using (@Html.BeginForm())
{
    @Html.EditorFor(model => data)
    <input type="submit" />
}

Сгенерировано html

<form action="/" method="post">
<div class="editor-label">
<label for="data_X">X</label>
</div>
<div class="editor-field">
<input class="text-box single-line" data-val="true" data-val-range="The field X must be between 0 and 10." data-val-range-max="10" data-val-range-min="0" data-val-required="The X field is required." id="data_X" name="data.X" type="number" value="0"> 
<span class="field-validation-valid" data-valmsg-for="data.X" data-valmsg-replace="true"></span>
</div>
<div class="editor-label">
<label for="data_Y">Y</label>
</div>
<div class="editor-field"><input class="text-box single-line" data-val="true" data-val-range="The field Y must be between 0 and 10." data-val-range-max="10" data-val-range-min="0" data-val-required="The Y field is required." id="data_Y" name="data.Y" type="number" value="0"> 
<span class="field-validation-valid" data-valmsg-for="data.Y" data-valmsg-replace="true"></span>
</div>
<input type="submit">
<input name="__RequestVerificationToken" type="hidden" value="deleted">
</form>

1 Ответ

0 голосов
/ 03 апреля 2020

Глядя на ваш сгенерированный html, кажется, что ваш контроллер должен принимать параметры "data.X" и "data.Y", которые не будут работать с именами параметров по очевидным причинам.

Вы можете получить объемные данные формы, заставив свой метод принять IFormCollection:

[HttpPost]
        public IActionResult Index(IFormCollection collection)
        {
            Assembly dllAssembly = Assembly.LoadFile(Environment.CurrentDirectory + 
                                                 "\\TestLib.dll");
            Type dllType = dllAssembly.GetType("TestLib.TestModel");
            tempObj = Activator.CreateInstance(dllType);

            dllType.GetProperty("X").SetValue(tempObj, int.Parse(collection["data.X"]));
            dllType.GetProperty("Y").SetValue(tempObj, int.Parse(collection["data.Y"]));

            ViewBag.Message = tempObj;
            return View();
        }

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...