2016-04-26 44 views
6

對不起,但我的大部分搜索帶我到舊的MVC代碼。任何幫助將不勝感激。在MVC 6中,如何在視圖中對複選框列表進行編碼並將選中的值傳遞給控制器​​?

在MVC 6標籤幫手,你怎麼編寫一組複選框:標籤

  • 使用標記輔助所以點擊它會切換選中的值
  • 保存(綁定?)的檢查值到IsOptionSelected財產
  • 點擊提交

後通過這些檢查的值回控制器?

我能夠正確顯示帶有標籤的複選框,但我不知道如何通過模型將選中的值傳遞迴控制器。現在,IsOptionSelected值返回爲false。

我還能夠爲標籤工作制作html助手,但不能用於標籤助手。我可能也編碼這些都是錯誤的,所以任何提示都會有所幫助!

這是我到目前爲止有:

顯示:

Phone Options Checkboxes

實體:

public class PhoneOption 
{ 
    public bool IsOptionSelected { get; set; } = false; 
    public int OptionId { get; set; } 
    public string OptionName { get; set; } 
} 

型號:

[Display(Name = "Phone Options")] 
public IEnumerable<PhoneOption> PhoneOptions { get; set; } 

. . . . 
PhoneOptions = repository.GetPhoneOptions(); 

庫:

public IEnumerable<PhoneOption> GetPhoneOptions() 
{ 
    IEnumerable<PhoneOption> options = new[] 
    { 
     new PhoneOption { OptionId = 1, OptionName = "Phone Case",  IsOptionSelected = false }, 
     new PhoneOption { OptionId = 2, OptionName = "Screen Protector", IsOptionSelected = false }, 
     new PhoneOption { OptionId = 3, OptionName = "Car Charger",  IsOptionSelected = false }, 
     new PhoneOption { OptionId = 4, OptionName = "Extra Cable",  IsOptionSelected = false } 
    }; 
    return options; 
} 

查看:

<div class="form-group"> 
    <label class="control-label">Phone Options</label> 
    <div> 
     @foreach (var option in Model.PhoneOptions) 
     { 
      <div> 
       @{ string cbId = "PhoneOption_" + @option.OptionId; } 
       <input [email protected] type="checkbox" [email protected] [email protected] [email protected] /> 
       @Html.Label(@cbId.ToString(), @option.OptionName) 
       @*This is causing invalid operation exception*@ 
       @*<label [email protected]()>@option.OptionName</label>*@ 
       <span [email protected] class="text-danger" role="alert"></span> 
      </div> 
     } 
    </div>  
</div> 

提前感謝!

+0

我猜asp-for是以錯誤的方式使用的。將輸入中的[email protected]更改爲asp-for =「IsOptionSelected」,以確保將其綁定到PhoneOption中的正確屬性。標籤[email protected]()中的相同內容是錯誤的。請參閱此處的教程以瞭解標記助手.http://www.davepaquette.com/archive/2015/05/18/mvc6-select-tag -helper.aspx –

+0

感謝您的建議,但更改爲asp-for =「IsOptionSelected」會拋出語法錯誤,因爲它不在主模型中。它是迭代過程中Model.PhoneOption選項的一部分。 asp-for = option.IsOptionSelected也不起作用。是的,我已經閱讀過教程,但它沒有涵蓋像我想要做的那樣的複選框列表。 –

+1

啊,我知道了。檢查這是否有幫助http://stackoverflow.com/questions/15375800/model-binding-to-a-list-mvc-4 –

回答

6

這是最後我做了什麼,使其工作。我不確定這是否是最好的方式。我必須仍然使用html助手,因爲標記助手不起作用。

型號:

public List<PhoneOption> PhoneOptions { get; set; } 
. . . 
PhoneOptions = repository.GetPhoneOptions().ToList(); 

查看

@if (@Model.PhoneOptions != null && @Model.PhoneOptions.Count() > 0) 
{ 
    for (int i = 0; i < @Model.PhoneOptions.Count(); i++) 
    { 
     <div> 
      <input asp-for="@Model.PhoneOptions[i].IsOptionSelected" type="checkbox" /> 
      <label asp-for="@Model.PhoneOptions[i].IsOptionSelected">@Model.PhoneOptions[i].OptionName</label> 

      @*If these are not included, all OptionIds become 0 and all OptionName becomes null*@ 
      @Html.HiddenFor(x => @Model.PhoneOptions[i].OptionId) 
      @Html.HiddenFor(y => @Model.PhoneOptions[i].OptionName) 
     </div> 
    }  
} 

我希望這可以幫助別人誰是有同樣的複選框列表的問題。

更新: 我已經更新了html助手以標記helpers上面。

+1

很高興爲你工作。並感謝您發佈您的解決方案。 –

+1

使用標籤助手應該可以正常工作 - 只要你使用'for'循環並且集合是'IList ''輸入asp-for =「Model.PhoneOptions [i] .IsOptionSelected」type =「checkbox」/>' '(不'IEnumerable ' –

+0

謝謝,@StephenMuecke!我試了一下,它有一點改變 - 「輸入asp-for =」@ Model.PhoneOptions [i] .IsOptionSelected「type =」checkbox「id =」 @cbId「/>'我還是不能讓標籤的標籤幫助器」附加「到複選框,但這兩者:1)''和2)''不可點擊切換複選框值。如果你知道如何,那將會很棒! –

0

這是語法應該如何在你的每個ASP換應該被包裹在一個字符串引號

@foreach (var option in Model.PhoneOptions) 
     { 
      <div> 
       @{ string cbId = "PhoneOption_" + @option.OptionId; } 
       <input asp-for="@option.IsOptionSelected" type="checkbox" value="@option.IsOptionSelected" id="@cbId" name="@cbId" /> 
       @Html.Label(@cbId.ToString(), @option.OptionName) 
       @*This is causing invalid operation exception*@ 
       @*<label asp-for="@cbId">@option.OptionName</label>*@ 
       <span asp-validation-for="@cbId" class="text-danger" role="alert"></span> 
      </div> 
     } 
+1

對不起,我試過這個,但IsOptionSelected值仍然在控制器中發佈爲false,即使複選框被選中。 –

相關問題