单选按钮上的模型绑定为该属性返回 null (ASP.NET Core)

Posted

技术标签:

【中文标题】单选按钮上的模型绑定为该属性返回 null (ASP.NET Core)【英文标题】:Model binding on radio button(s) returns null for that property (ASP.NET Core) 【发布时间】:2016-08-20 15:16:52 【问题描述】:

所以我有四个单选按钮,它们绑定到我的模型的属性之一,它们都具有不同的值。但是,当表单提交时,该属性返回 null(而其他所有内容都正确返回)。代码:

<div id="RadioButtonGroup">
    <label asp-for="Object.PropertyOne" class="radio-inline">
         <input asp-for="Object.PropertyOne" value="A"  type="radio" name="optradio" >Option One
    </label>
    <label asp-for="Object.PropertyOne" class="radio-inline">
         <input asp-for="Object.PropertyOne" value="B"  type="radio" name="optradio" >Option Two
    </label>
    <label asp-for="Object.PropertyOne" class="radio-inline">
         <input asp-for="Object.PropertyOne" value="C"  type="radio" name="optradio" >Option Three
    </label>
     <label asp-for="Object.PropertyOne" class="radio-inline">
         <input asp-for="Object.PropertyOne" value="D"  type="radio" name="optradio" >Option Four
    </label>
</div>

我选择一个,提交表单,Object.PropertyOne 返回 null。但是,如果我在 ViewModel 中手动设置 Object.PropertyOne,它会正确显示。我错过了什么?

【问题讨论】:

【参考方案1】:

不要为您的单选按钮手动指定name。如果您删除name="optradio",您将看到标签助手将发出一个名称。如果您指定自己的名称,Model Binder 将无法正确处理您的属性。

您可以通过添加第二个属性PropertyTwo 并查看源代码并调试控制器来看到这一点。您会发现PropertyTwo 的每个单选按钮的名称为Object_PropertyTwo,并且它会正确绑定(而Object.PropertyOne 仍然无法绑定):

型号

 public class MyObject
   
      public string PropertyOne  get; set; 
      public string PropertyTwo  get; set; 
   

   public class MyModel
   
      public MyObject Object  get; set; 
   

控制器

 public ActionResult Foo()
  
     return View(new MyModel()  Object = new MyObject() );
  

  [HttpPost]
  public ActionResult Foo(MyModel model)
  
     return View();
  

查看

@
   ViewData["Title"] = "Test Page";


@model MyModel

<form asp-controller="Home" asp-action="Foo" method="post">
   <div id="RadioButtonGroup">
      <label asp-for="Object.PropertyOne" class="radio-inline">
         <input asp-for="Object.PropertyOne" value="A" type="radio" name="optradio" >Option One
      </label>
      <label asp-for="Object.PropertyOne" class="radio-inline">
         <input asp-for="Object.PropertyOne" value="B" type="radio" name="optradio" >Option Two
      </label>
      <label asp-for="Object.PropertyOne" class="radio-inline">
         <input asp-for="Object.PropertyOne" value="C" type="radio" name="optradio" >Option Three
      </label>
      <label asp-for="Object.PropertyOne" class="radio-inline">
         <input asp-for="Object.PropertyOne" value="D" type="radio" name="optradio" >Option Four
      </label>
   </div>
   <div id="RadioButtonGroup">
      <label asp-for="Object.PropertyOne" class="radio-inline">
         <input asp-for="Object.PropertyTwo" value="A" type="radio">Option One
      </label>
      <label asp-for="Object.PropertyOne" class="radio-inline">
         <input asp-for="Object.PropertyTwo" value="B" type="radio">Option Two
      </label>
      <label asp-for="Object.PropertyOne" class="radio-inline">
         <input asp-for="Object.PropertyTwo" value="C" type="radio">Option Three
      </label>
      <label asp-for="Object.PropertyOne" class="radio-inline">
         <input asp-for="Object.PropertyTwo" value="D" type="radio">Option Four
      </label>
   </div>
   <input type="submit" />
</form>

【讨论】:

哇,非常感谢您提供详细且解释清楚的答案!我能够删除自定义名称,并且就像您说的那样完美地工作。这些小东西有时很难捕捉,也很容易错过,再次感谢。我会浪费很多时间试图弄清楚。 存在 name 属性以将所有单选按钮分组到 name 属性具有相同值的组中。如果我不能明确设置该名称,知道哪些单选按钮属于哪个组,那么 asp.net 核心如何知道这一点? @Elizabeth,传递给 asp-for 属性的属性名称用于 id 和 name 属性的值。但是,您可以通过为每个元素提供您自己的唯一 id 值来覆盖此行为。由于 asp-for 属性规定了组名,为值属性设置的不同信息将进入一个字符串变量。

以上是关于单选按钮上的模型绑定为该属性返回 null (ASP.NET Core)的主要内容,如果未能解决你的问题,请参考以下文章

为啥视图模型中的单选按钮绑定被触发不止一次

如何在单选按钮上绑定数据

将单选按钮组绑定到 WPF 中的属性

在 AngularJS + Bootstrap 中添加数据切换属性时,单选按钮绑定不起作用

如何在淘汰赛中绑定单选按钮的名称属性

如何访问 AS3 中的单选按钮组?