2013-10-08 81 views
0

我越來越可怕「的參數字典包含參數無效項非可空類型的‘equipmentid’」錯誤試圖通過一個形式來傳遞數據的時候。我搜索谷歌和堆棧溢出的答案和解釋,但我已經得出結論,問題是我不理解這些東西如何工作。從傳統的編程背景來看,網絡對我來說並不直觀。傳遞PARAMS與@ Html.Beginform

這裏是我的視圖代碼

@using (Html.BeginForm("CreateReservation", "ReservationList", FormMethod.Get, new { @equipmentID = 1 })) 
{ 
    <button class="btn btn-blue">Click</button> 
} 

這裏是我的控制器

public ActionResult CreateReservation(int equipmentid) 
{ 
    // TODO: Query the piece of equipment being reserved. 
    return View(); 
} 

誰能告訴我,究竟我做錯了什麼?從我之前閱讀過的答案和我查看過的例子來看,我覺得這應該起作用。

+0

好吧,所以我刪除了FormMethod.Get參數,它的作品完美(和@不應該在那裏)。現在我的問題是,爲什麼?我已經看到了FormMethod.Get的視圖代碼,它們應該能夠像我讀過的一樣工作。我是否缺少需要在控制器中工作的內容? –

回答

0

我從你的代碼假設這是一個Asp.Net MVC項目,使用C#作爲語言。

有很多問題。第一個是equipmentID變量沒有被傳遞給視圖。有很多方法可以做到這一點。最簡單的將是做在使用ViewData字典控制器,如下:

public ActionResult CreateReservation(int equipmentid) 
{ 
    // TODO: Query the piece of equipment being reserved. 

    ViewData["equipmentID"] = equipmentid; 

    return View(); 
} 

一旦做到這一點,你可以修改您的視圖代碼使用的值如下:

@using (Html.BeginForm("CreateReservation", "ReservationList", FormMethod.Get, new { equipmentID = ViewData["equipmentID"] })) 
{ 
    <button class="btn btn-blue">Click</button> 
} 

對於一個或兩個值來說這很好,但是當視圖變得更加複雜時,您更希望創建一個ViewModel類,並將該類傳遞給您的視圖。其次 - 在BeginForm調用中您在equipmentID前面使用@表示您可能需要研究一下Razor語法。一個好的開始是Phil Haack's Razor Syntax Quick Reference。 Razor語法告訴解析器你的視圖的哪些部分是靜態HTML,它應該按原樣輸出,哪些部分是在發送到瀏覽器之前應該執行的C#代碼。如果您使用Visual Studio作爲您的IDE,那麼突出顯示代碼的哪些部分被解釋爲C#代碼以及哪些部分是普通HTML是非常好的。

在下面的屏幕截圖中,您可以看到VS2012以淺灰色背景色突出顯示C#代碼。 @符號是C#代碼的開始 - 因此除非您跳出C#代碼塊並返回到HTML,否則不需要再次使用它。

Example of how Razor C# code is highlighted in Visual Studio 2012

第三,你可能不會想通過設備ID爲您的表單標籤內的HTML屬性。你應該在表單體中創建一個隱藏的表單字段,並將名稱設置爲equipmentID,並將該值設置爲該變量的值。目前正在使用的話將HTML屬性添加到窗體標籤的方式,生成的代碼會是這個樣子:

<form action="/ReservationList/CreateReservation" method="get" equipmentID="1"> 

而這額外的屬性不會在你的代碼檢索。相反,在你的看法做這樣的事情:

@using (Html.BeginForm("CreateReservation", "ReservationList", FormMethod.Get, new { name = "myFormName", id = "myFormID" })) 
{ 
    @Html.Hidden("equipmentID", ViewData["equipmentID"]) 
    <button class="btn btn-blue">Click</button> 
} 
+0

很好的解釋謝謝!雖然,我注意到開始表單行仍然會將actionID添加到動作鏈接的末尾。 –

+0

是的 - 有斑點。我決定一次只做一次更改,以便明確變更。第一個改變就是展示如何使用ViewData。我的最後一段代碼顯示瞭如何在不傳遞設備ID的情況下初始化表單,並使用隱藏字段。 –