单选按钮上的模型绑定为该属性返回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
并查看源代码和调试控制器来看到这一点。你会发现,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>
非常感谢你的详细和解释良好的答案!我能够删除自定义名称,它就像你说的那样完美无瑕。这些小东西有时很难捕捉,很容易错过,所以再次感谢。我会花费这么多时间试图弄清楚它。 – Daath
name属性存在可将所有单选按钮组合到名称属性具有相同值的组中。如果我不能明确地设置该名称,那么知道哪个放射按钮属于哪个组,asp.net核心如何知道这一点? – Elisabeth