.NET MVC - сопоставить текст из TextBoxFor с массивом - PullRequest
0 голосов
/ 03 октября 2019

Моя модель настроена так, что контроллер может выдавать Json-ответ данных из пользовательского ввода. Свойство rgba моей модели представляет собой массив целых чисел. Если пользователь вводит текст, скажем, «255, 0, 0, 1» в TextBoxFor для «rgba», текст не отображается в массив (что, как я думал, должно было произойти автоматически). Вместо этого int [0] - это то, что делает его контроллером.

Я перепробовал все возможные решения, которые можно найти здесь, включая передачу объекта FormCollection в контроллер. Я пытался получить значение TextBoxFor с помощью JS / jQuery и манипулировать данными, но не могу понять, как передать манипулированные данные обратно в модель (это кажется не идеальным, так как должен быть простой способ сделатьэто в .Net).

Контроллер:

public class HomeController : Controller
{
    public IActionResult NewColor()
    {
        Rootobject newColor = new Rootobject();

        return View(newColor);
    }

    [HttpPost]
    public IActionResult NewColor(Rootobject color)
    {

        var json = JsonConvert.SerializeObject(color);

        return Json(json);

    }
}

Модель:

public class Rootobject
{
    public Color[] colors { get; set; }
}

public class Color
{
    public string color { get; set; }
    public string category { get; set; }
    public string type { get; set; }
    public Code code { get; set; }
}

public class Code
{
    public int[] rgba { get; set; }
    public string hex { get; set; }
}

Вид:

@model WebAppPlayground.Models.Rootobject

@{
    ViewData["Title"] = "New Color";
}

<style>
    input:focus {
        border-radius: 5px;
    }

    input {
        padding: 2px;
        border-radius: 5px;
        border-style: ridge;
    }
</style>

<h2>New Color</h2>

<h4>Color</h4>
<hr />
<center>
    @using (Html.BeginForm("NewColor", "Home", FormMethod.Post, new { id = "form" }))
    {
        <table style="border-collapse:separate; border-spacing: 5px 5px">
            <tbody>
                <tr class="form-group" for="Color">
                    <td>Color</td>
                    <td>@Html.TextBoxFor(m => m.colors[0].color)</td>
                </tr>
                <tr class="form-group">
                    <td class="">Category</td>
                    <td>@Html.TextBoxFor(m => m.colors[0].category)</td>
                </tr>
                <tr class="form-group">
                    <td class="">Type</td>
                    <td>@Html.TextBoxFor(m => m.colors[0].type)</td>
                </tr>
                <tr class="form-group">
                    <td class="">rgba</td>
                    <td>@Html.TextBoxFor(m => m.colors[0].code.rgba, new { id = "rgba"})</td>
                </tr>
                <tr class="form-group">
                    <td class="">Hex</td>
                    <td>@Html.TextBoxFor(m => m.colors[0].code.hex)</td>
                </tr>


            </tbody>
        </table>

        <div class="form-group">
            <input type="submit" value="Create" class="btn btn-primary" />
        </div>
    }

    <div>
        <a asp-action="Index">Back to List</a>
    </div>
</center>

@section Scripts {
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

Я хотел бы мой контроллерполучить массив Int через rgba TextBoxFor, где пользователь вводит текст, например 255, 0, 0, 1.

Я думаю, что есть что-то (очевидное), которое я пропускаю или не понимаю.


**** Обновлен метод поста контроллера, чтобы удалить добавленную опору 'rgba_str' для @i_ll_be_back 'sответьте и предоставьте необходимые данные Json:

        [HttpPost]
        public IActionResult NewColor(Rootobject color)
        {
            var json = JsonConvert.SerializeObject(color);

            JObject jsonObject = JObject.Parse(json);

            JObject code = (JObject)jsonObject["colors"][0]["code"];

            code.Property("rgba_str").Remove();

            return Json(jsonObject);
        }

1 Ответ

1 голос
/ 03 октября 2019

Попробуйте изменить форму класса Code следующим образом:

public class Code
{
    public int[] rgba { get; set; }
    public string rgba_str
    {
        get
        {
            var res = "";
            for(int i = 0; i < rgba.Length; i++) {
                res += rgba[i] + (i != rgba.Length - 1 ? "," : "");
            }
            return res;
        }
        set
        {
            var strArray = value.Split(',');
            rgba = new int[strArray.Length];
            for(int i = 0; i < strArray.Length; i++) {
                rgba[i] = int.Parse(strArray[i]);
            }
        }
    }
    public string hex { get; set; }
}

Теперь свяжите TextBoxFor с полем rgba_str

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