@ Html .EditorДля неверного свойства - PullRequest
0 голосов
/ 24 января 2020

У меня есть бритва, где я редактирую свои данные.

Классы, которые у меня есть, выглядят так:

public class A
{
    public string Value1 { get; set; }
    public int Value2 { get; set; }

    public A()
    {
        Value1 = "First";
        Value2 = 2;
    }
}

public class B : A
{
    public int Value3 { get; set; }
    public new CustomClass Value1 { get; set; }

    public B()
    {
        Value3 = 3;
        Value2 = new CustomClass();
    }
}

теперь, когда я звоню своему Razor View, я вызываю его с помощью это:

public IActionResult Edit()
{
    return View(new B());
}

Внутри моего cshtml кода я настроил его так:

@using (Html.BeginForm("Apply", "MyController", FormMethod.Post))
{
    @Html.HiddenFor(x => x.Value1);


    <label>Change value 3</label>
    @Html.EditorFor(x => x.Value3);

    <button class="button1">Apply!</button>
}

Теперь по какой-то причине, когда я применяю изменения, они применяются, но с ошибкой * Параметр 1014 *.

Я проверил ввод кода и увидел, что Value1 имеет хорошее значение, проверил код /MyController/Apply и имеет значение null.

Когда я установил точку останова внутри cshtml чтобы увидеть, какое значение имеет @HiddenFor(x => x.Value1) я увидел что-то странное для меня, и именно это (свойство тега на изображении представлено как Value2 в приведенном выше коде):

Итак, по какой-то причине у бритвы почему-то есть оба свойства, но одно с null (которое он получает изнутри) и одно с хорошими значениями.

Что я могу сделать?

Ответы [ 2 ]

0 голосов
/ 24 января 2020

Есть несколько проблем с вашим кодом. Во-первых, вы не можете назначить новый CustomClass для Value2, поскольку он не переопределяется с оператором new (так же, как вы делали это с Value1).

Другое - то, что вы должны в верхней части страницы Razor (cs html) включить свою модель представления @model <PathToViewModel>.B, прежде чем начать ее использовать.

Есть рабочий пример:

Просмотр модели

public class A
{
    public string Value1 { get; set; }
    public int Value2 { get; set; }

    public A()
    {
        Value1 = "First";
        Value2 = 2;
    }
}

public class B : A
{
    public int Value3 { get; set; }

    // This line overriding Value1 from the parent class A, so you can now assign it to a boolean (or CustomClass) value
    public new bool Value1 { get; set; }

    public B()
    {
        Value3 = 3;
        // Value2 = new CustomClass(); //Error since Value2 is declared to integer in the parent class

        // What you can do is to assign Value2 to a new integer value
        Value2 = 8;
    }
}

Страница бритвы

@model Web.ViewModels.Account.B
@using (Html.BeginForm("MyAction", "MyController", FormMethod.Post))
{

    @Html.HiddenFor(x => x.Value1);

    <p>Value 1: @Model.Value1</p> // prints: False
    <p>Value 2: @Model.Value2</p> // prints: 8
    <p>Value 2: @Model.Value3</p> // prints: 3

    <label>Change value 3</label>
    @Html.EditorFor(x => x.Value3);

    <button class="button1">Apply!</button>
}

Действие в контроллере правильное.

Опубликовать действие:

Post action

Я также рекомендую вам использовать помощников тегов вместо HTML помощников, вы можете прочитайте здесь подробнее об этом, если вы используете. NET Core. Ниже приведен аналогичный пример, написанный с помощью помощников тегов.

@model Web.ViewModels.Account.B
<form asp-controller="MyController" asp-action="MyAction" method="post">

    <input type="hidden" asp-for="Value1" />

    <label asp-for="Value3">Change value 3</label>
    <input asp-for="Value3" />

    <button class="button1">Apply!</button>

</form>
0 голосов
/ 24 января 2020

Я получаю ожидаемый ответ. Я использую. Net 4.6 MVC. Как выглядит ваше действие POST? enter image description here

 [HttpPost]
    public ActionResult Apply(B b)
    {
        ViewBag.Message = "Your application description page.";

        return View();
    }
...