Как правильно использовать привязку модели, чтобы получить значение радиокнопки в Razor Pages - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть набор переключателей на странице бритвы, и я хочу получить и использовать выбранное значение этих переключателей в моем коде на стороне сервера после отправки формы.HTML-код для переключателей:

<label><input class="boost_radio" onclick="boostNo(1)" asp-for="Boost_No.Number" type="radio" name="boostno" value=1 checked="checked" disabled="disabled" />1</label>
<label><input class="boost_radio" onclick="boostNo(2)" asp-for="Boost_No.Number" type="radio" name="boostno" value=2 disabled="disabled" />2</label>
<label><input class="boost_radio" onclick="boostNo(3)" asp-for="Boost_No.Number" type="radio" name="boostno" value=3 disabled="disabled" />3</label>
<label><input class="boost_radio" onclick="boostNo(4)" asp-for="Boost_No.Number" type="radio" name="boostno" value=4 disabled="disabled" />4</label>
<span asp-validation-for="Boost_No.Number"></span>

Я использую привязку модели для получения значения на стороне сервера:

public class BoostNo
{
    [Required(ErrorMessage = "Select Number of Boost Units!")]
    public int Number { get; set; }
}

Этот класс создается следующим образом:

[BindProperty]
public BoostNo Boost_No { get; set; }

К сожалению, каждый раз, когда я запускаю код, я получаю Boost_No.Number = 0.Я попытался изменить тип данных на строку, но я просто получаю string = null.

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

Буду очень признателен, если кто-нибудь сможет мне помочь.Спасибо.

Редактировать:

Вот метод обработчика, в котором используется привязка модели:

public IActionResult OnPostSubmit()
{
    //save data to sql db
    SaveData();

    //then some other unrelated stuff
}

И метод SaveData():

public void SaveData ()

{
    //stuff

    //now how the radio button values are actually used
    for (int param_i = 1; param_i <= Boost_No.Number; param_i++)
    {
          //...
    }
    //then a paramaterized sql database query
}

Ответы [ 3 ]

0 голосов
/ 08 февраля 2019

Все ваши радиовходы установлены на disabled, поэтому при отправке формы никакое значение не будет передано в коллекцию форм.Удалите атрибуты disabledname) из входных данных:

<label><input class="boost_radio" onclick="boostNo(1)" asp-for="Boost_No.Number" type="radio" value=1 checked="checked" />1</label>
<label><input class="boost_radio" onclick="boostNo(2)" asp-for="Boost_No.Number" type="radio"  value=2 />2</label>
<label><input class="boost_radio" onclick="boostNo(3)" asp-for="Boost_No.Number" type="radio"  value=3 />3</label>
<label><input class="boost_radio" onclick="boostNo(4)" asp-for="Boost_No.Number" type="radio"  value=4 />4</label>
0 голосов
/ 11 февраля 2019

Вот минимальный пример, который я настроил, чтобы заставить его работать.

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

[BindProperty]
public BoostNo Boost_No { get; set; }

public IActionResult OnPost()
{
    return Page();
}

Теперь в HTML

<label><input asp-for="Boost_No.Number" type="radio value=1 checked="checked"/>1</label>
<label><input asp-for="Boost_No.Number" type="radio" value=2/>2</label>
<label><input asp-for="Boost_No.Number" type="radio" value=3/>3</label>
<label><input asp-for="Boost_No.Number" type="radio" value=4/>4</label>

Изменения:

  1. Сначала удалите атрибут name.Зачем?потому что помощник по тегу asp-for создаст для вас атрибут name.Помимо предоставления атрибута name, которому вы присваиваете значение boostno, атрибут name используется для привязки значения к модели, другими словами, ваш дескриптор OnPost не имеет boostnoпараметр где угодно для привязки.
  2. Во-вторых, если поле ввода равно disabled, то входное значение будет игнорироваться.Я бы дважды проверил это перед тем, как вы отправите форму, откройте инструменты разработчика (F12) и дважды проверите ваши элементы поля ввода, чтобы убедиться, что они не отключены, даже если пользовательский интерфейс может предложить иное.
0 голосов
/ 08 февраля 2019

если это отдельные радиокнопки, у вас должна быть индивидуальная привязка для каждой из них, сейчас вы используете одинаковые для каждой из радиокнопок.(Boost_No.Number).Либо создайте список List, а затем привяжите отдельные переключатели, например, «Boost_No [0] .Number», или создайте разные свойства для каждого из них (на ваш выбор)

...