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

Daa*_*ath 5 c# asp.net model-binding razor asp.net-core

所以我有四个单选按钮绑定到我的模型属性之一,所有属性都具有不同的值.但是,当表单提交时,该属性返回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>
Run Code Online (Sandbox Code Playgroud)

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

ste*_*kil 11

不要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; }
   }
Run Code Online (Sandbox Code Playgroud)

调节器

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

  [HttpPost]
  public ActionResult Foo(MyModel model)
  {
     return View();
  }
Run Code Online (Sandbox Code Playgroud)

视图

@{
   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>
Run Code Online (Sandbox Code Playgroud)