2011-04-21 92 views
7

我發現了一個奇怪的場景,防止布爾?正確地發送回控制器。這是一個非常具體的問題,因此請按照重新創建的步驟操作。ASP.Net MVC3模型綁定錯誤

應用程序必須作爲虛擬文件夾部署在IIS中,以便/ home/Test URL不是/ Virtual/Home/Test。

首頁控制器:

[HttpGet] 
public ActionResult Test(int? temp, bool? testBool) 
{ 
    return View(testBool); 
} 

/主頁/測試視圖(剃刀CSHTML):

@model bool? 
@{ 
    ViewBag.Title = "Test"; 
} 

@using (Html.BeginForm("Test", "Home", FormMethod.Get)) 
{ 
    @Html.CheckBox("testBool", Model ?? false, new { onchange = "this.form.submit();" }) 
    @Html.Label(Model == true ? "True" : "False") 
} 

在回來後的布爾?由於int而不會使其成爲控制器?之前它在參數列表中。這可以通過把布爾解決?在int之前?在參數列表中,但顯然你不應該這樣做。如果不在IIS上的虛擬文件夾中,它也可以正常工作。如果使用POST方法也存在同樣的問題,但是發佈的是bool而不是bool?可以工作,但如果不在虛擬文件夾中則不需要,所以不必這樣做。

有沒有其他人經歷過這個,有什麼解釋爲什麼綁定失敗或者它只是一個MVC3中的錯誤?

如果這只是一個錯誤,有沒有人知道什麼是提交錯誤報告正確的ASP.Net MVC頻道?

更新:

我發現,如果你有在動作參數的任何數量的可空變量,只有第一個將永遠工作者和所有其他人將無法被填充。任何人都知道這是設計還是錯誤?

回答

1

顯然這仍然是一個問題。以爲它現在已經被修復了。解決這個問題的一個方法是將其添加到您的Application_Start方法中。

ModelMetadataProviders.Current = new DataAnnotationsModelMetadataProvider(); 

添加這將允許可爲空的參數行爲適當。我很驚訝這個錯誤仍然存​​在,因爲它在12月被稱爲RC2。

本文中路由可選參數之間的區別是,在您的示例中,路由不是問題。在這種情況下,您正在發佈(或查詢字符串)數據,並且不會正確填充可空行爲參數。我已經檢查過mvc3源代碼,並且不明白爲什麼這應該是一個問題,因爲它調試它似乎正常工作,並通過源結果以預期的行爲步進。我相當肯定,即使Scott Guthrie說現在應該是現在,這個問題還沒有解決......

+0

工作!優秀。按照說明在Global.asax.cs中只添加你說的那一行到Application_Start方法。開始擔心沒有人會得到這個答案。希望這個錯誤能夠在未來的更新中由MVC團隊解決。謝謝你的幫助。 – 2011-05-05 09:43:53

+0

太棒了,@克里斯。很高興爲你工作。奇怪的是,它在當地調試時很有效,這讓我想知道我的測試服務器上安裝了什麼版本......:) – Buildstarted 2011-05-05 14:24:20

+0

也許你擁有比我更新的MVC3版本。我將不得不檢查是否有更新的版本可用。你是否真的擁有像/ Virtual/Home/Test這樣的虛擬目錄?如果不正確的話,會有很多比特會導致它在我的帖子中詳述的所有內容。 – 2011-05-05 14:26:22

3

This文章可能對您有用。

+0

這是一個類似的錯誤,可能是相關的。不幸的是,錯誤和解決方法與連續的可選路由值有關,而我的問題是在URL之後的URL中的參數。 – 2011-04-21 14:10:28

+0

(+1)我在您鏈接的文章上留下了一篇文章,看看是否也可以在那裏獲得任何反饋。 – 2011-04-21 14:20:40