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

问题描述:

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

<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。如果你删除name="optradio",你会看到标签助手会发出一个名字。如果您指定自己的名称,则模型活页夹将无法正确处理您的财产。

您可以通过添加第二个属性PropertyTwo并查看源代码和调试控制器来看到这一点。你会发现,PropertyTwoObject_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> 
+0

非常感谢你的详细和解释良好的答案!我能够删除自定义名称,它就像你说的那样完美无瑕。这些小东西有时很难捕捉,很容易错过,所以再次感谢。我会花费这么多时间试图弄清楚它。 – Daath

+0

name属性存在可将所有单选按钮组合到名称属性具有相同值的组中。如果我不能明确地设置该名称,那么知道哪个放射按钮属于哪个组,asp.net核心如何知道这一点? – Elisabeth