单选按钮 returns 上的模型绑定 属性 为空(ASP.NET 核心)

Model binding on radio button(s) returns null for that property (ASP.NET Core)

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

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

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

不要手动为您的单选按钮指定 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>