如何正确使用模型绑定来获取Razor页面中的单选按钮值

时间:2019-02-08 12:41:01

标签: c# asp.net asp.net-core razor-pages

我在剃须刀页面上有一组单选按钮,提交表单后,我想在服务器端代码中获取并使用这些单选按钮的选定值。单选按钮的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 :(得分:2)

这里是我设置的最小示例,以使其正常工作。

这是我的剃刀页面句柄,并且我使用与您相同的类实现。

[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属性外,您还为其赋予值boostnoname属性还用于将该值绑定到模型,换句话说,就是您的OnPost处理没有任何绑定的boostno参数。
  2. 第二,如果输入字段为disabled,则输入值将被忽略。在提交表单开放式开发者工具(F12)之前,我会仔细检查一遍,并仔细检查您的输入字段元素,以确保它们未被禁用,即使UI可能会建议这样做。

答案 1 :(得分:1)

如果这些是单独的单选按钮,则每个按钮应具有单独的绑定,现在您对每个单选按钮使用相同的绑定。 (Boost_No.Number)。 创建列表列表,然后绑定单个单选按钮 “ Boost_No [0] .Number”或为每个属性创建不同的属性(您的选择)

答案 2 :(得分:1)

所有单选输入都设置为disabled,因此在提交表单时不会在表单集合中传递任何值。从输入中删除disabled(和name)属性:

<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>