2016-04-26 59 views
2

所以我有四個單選按鈕綁定到我的模型屬性中的一個,它們都具有不同的值。但是,當表單提交時,該屬性返回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,它顯示正確。我錯過了什麼?

回答

5

請勿手動爲單選按鈕指定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