单选按钮 returns 上的模型绑定 属性 为空(ASP.NET 核心)
Model binding on radio button(s) returns null for that property (ASP.NET Core)
所以我有四个单选按钮,它们绑定到我的模型的一个属性,它们都具有不同的值。但是,当表单提交时,属性 返回 null(而其他所有内容 returns 均正确)。代码:
<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>
我select一个,提交表单,Object.PropertyOne
returnsnull。但是,如果我在我的 ViewModel 中手动设置 Object.PropertyOne
,它会正确显示。我错过了什么?
不要手动为您的单选按钮指定 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>
所以我有四个单选按钮,它们绑定到我的模型的一个属性,它们都具有不同的值。但是,当表单提交时,属性 返回 null(而其他所有内容 returns 均正确)。代码:
<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>
我select一个,提交表单,Object.PropertyOne
returnsnull。但是,如果我在我的 ViewModel 中手动设置 Object.PropertyOne
,它会正确显示。我错过了什么?
不要手动为您的单选按钮指定 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>