单选按钮上的模型绑定为该属性返回 null (ASP.NET Core)
Posted
技术标签:
【中文标题】单选按钮上的模型绑定为该属性返回 null (ASP.NET Core)【英文标题】:Model binding on radio button(s) returns null for that property (ASP.NET Core) 【发布时间】:2016-08-20 15:16:52 【问题描述】:所以我有四个单选按钮,它们绑定到我的模型的属性之一,它们都具有不同的值。但是,当表单提交时,该属性返回 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
,它会正确显示。我错过了什么?
【问题讨论】:
【参考方案1】:不要为您的单选按钮手动指定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>
【讨论】:
哇,非常感谢您提供详细且解释清楚的答案!我能够删除自定义名称,并且就像您说的那样完美地工作。这些小东西有时很难捕捉,也很容易错过,再次感谢。我会浪费很多时间试图弄清楚。 存在 name 属性以将所有单选按钮分组到 name 属性具有相同值的组中。如果我不能明确设置该名称,知道哪些单选按钮属于哪个组,那么 asp.net 核心如何知道这一点? @Elizabeth,传递给 asp-for 属性的属性名称用于 id 和 name 属性的值。但是,您可以通过为每个元素提供您自己的唯一 id 值来覆盖此行为。由于 asp-for 属性规定了组名,为值属性设置的不同信息将进入一个字符串变量。以上是关于单选按钮上的模型绑定为该属性返回 null (ASP.NET Core)的主要内容,如果未能解决你的问题,请参考以下文章