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

标签 c# asp.net razor asp.net-core model-binding

所以我有四个单选按钮,它们绑定(bind)到我的模型的一个属性,它们都具有不同的值。但是,当表单提交时,该属性返回 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,它会正确显示。我错过了什么?

最佳答案

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

您可以通过添加第二个属性 PropertyTwo 并查看源代码和调试 Controller 来查看实际效果。您会发现 PropertyTwo 的每个单选按钮的名称都是 Object_PropertyTwo,并且它将正确绑定(bind)(而 Object.PropertyOne 仍然无法绑定(bind)绑定(bind)):

型号

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

   public class MyModel
   {
      public MyObject Object { get; set; }
   }

Controller

 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>

关于c# - 单选按钮上的模型绑定(bind)为该属性返回 null (ASP.NET Core),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36870942/

相关文章:

c# - 如何使方法在类中调用另一个方法?

c# - 无法使用 jquery ajax 调用 aspx 页面 Web 方法

.net - 如何将 css class 属性添加到 razor 中的文本框?

c# - ASP.NET MVC 中 TextBoxFor 的默认值

c# - 来自环境变量的.NET时区

c# - 来自 JsonResult 的动态 ActionLink?

c# - HttpClient 发布到 ApacheServer (Debian)

c# - 如何从 GridView 中的选择加载值?

c# - 从后面的代码向验证摘要添加错误消息

c# - 在独立页面中使用 C# 和 razor