2012-01-17 69 views
5

假我有這樣一個複選框:選中複選框並提交時Asp.Net MVC 2複選框始終在模型

<%= Html.CheckBoxFor(x => x.IsSendingQualitySurvey) %>/> 

,我得到了典型的2形式的值:

IsSendingQualitySurvey: true 
IsSendingQualitySurvey: false 

這對於mvc modelbinder處理複選框的方式非常有效。

然後在控制器動作:

[HttpPost] 
public ActionResult Edit(Guid id, TicketEditViewModel ticketEditViewModel) 

ticketEditViewModel.IsSendingQualitySurvey(正常布爾)始終爲false。

我沒有任何自定義模型粘合劑,它在別處工作。 奇怪的是我有另一種觀點認爲前一段,同樣的問題,我必須手動創建輸入,如下所示:

<input type="checkbox" value="true" name="<%=Html.NameFor(x => x.IsRequestingVisit) %>" id="<%=Html.NameFor(x => x.IsRequestingVisit) %>" /> 

這個工作,但是當我複製到完全相同的另一種觀點認爲,價值始終是虛假的。

Wheres the catch?

謝謝。

回答

1

模型粘合劑可能不會取得綁定。我的建議是你的行動改變:

[HttpPost] 
public ActionResult Edit(Guid id, TicketEditViewModel model) 

模型綁定想找到那個有適合你的對象名稱前綴的請求屬性。由於在客戶端沒有命名前綴,因此沒有帶前綴「ticketEditViewModel」的屬性。

另一種方法是將頁面命名爲一個變量:

<% var ticketEditViewModel = Model; %> 
<%= Html.CheckBoxFor(model => ticketEditViewModel.IsSendingQualitySurvey) %> 
+0

我忘了說,該模型實際上是填補了正確的方式,只是一個屬性缺失。另外我不認爲模型綁定器會關心前綴,因爲它甚至不會轉換爲輸入的結果,您確定嗎? – 2012-01-17 17:44:28

+1

模型聯編程序查看查詢字符串或表單集合中包含的值並嘗試按名稱綁定屬性。客戶端的ID /名稱字段(由HTML幫助程序生成)包含名稱空間,並且是用於變量的命名約定的直接結果。如果你有複雜的模型,或者你在頁面上創建變量,你會注意到HTML Helper會在你的控件上生成與你的變量名匹配的前綴。模型聯編程序中可能會有一些邏輯來涵蓋不匹配的名稱,但我不能肯定地說沒有挖出反射器。 – 2012-01-17 17:50:07

+0

嗯,所以也許是因爲我傳遞了兩個參數,活頁夾可能會引入命名空間,並且在那種情況下由於我的約定沒有找到模型參數?還沒有看到這些名稱空間。我明天會看看,謝謝至今。 – 2012-01-17 18:17:55

1

編輯拿到了棍子的錯誤結束...對不起

你試過取原始值出來後數據像這樣:

在控制器:

[HttpPost] 
public ActionResult Edit(Guid id, TicketEditViewModel ticketEditViewModel, 
              FormCollection fc) { 

    if(fc["IsSendingQualitySurvey"].Contains("true")) { 
     //Do something. 
    } 
}  

在View:

<%= Html.CheckBoxFor(model => model.IsSendingQualitySurvey) %> 

希望這有助於..

+0

我沒有找到它,所以我使用Request.Form [「IsSendingQualitySurvey」]。包含(「true」)',即使它很醜陋=( – 2012-01-31 09:07:40

0

對於以下模型:

公共類StartViewModel {

public string Id{ get; set; } 

public string Name { get; set; } 

public bool Accept { get; set; } 

}

- >接受=假。

解決方法:更改public bool接受{get;組; }公共字符串接受{get;組; }

提交時,如果複選框被選中,則「接受」值=「開」。您可以通過這種方式檢測檢查值。

0

我不確定這是否適用於您,但實際上它解決了同樣的問題。嘗試加入(不更換)一個隱藏字段相同型號的性質是這樣的:

@Html.HiddenFor(x => x.IsSendingQualitySurvey)