2012-07-06 40 views
2

我有一個視圖綁定到一個強類型的ViewModel,但我不是使用MVC3 HTML幫手,只是正常的HTML input標籤。但是,這似乎並沒有正確地將值傳遞給操作方法,因爲ViewModel完全爲空。MVC3 ViewModel在窗體沒有幫助者只有空值

視圖模型:

class QuoteSearch { 
    public long? CustomerId { get; set; } 
    public string CustomerFirstName { get; set; } 
    public string CustomerLastName { get; set; } 
} 

查看:

@model QuoteSearch 

<form action="/quotes/search" method="POST"> 
    <p>Customer ID: <input id="CustomerIdField" name="CustomerId" type="text" /></p> 
    <p>Customer First Name: <input id="CustomerFirstNameField" name="CustomerFirstName" type="text"/></p> 
    <p>Customer Last Name: <input id="CustomerLastNameField" name="CustomerLastName" type="text"/></p> 
    <p><button id="SearchButton" type="submit">Search</button></p> 
</form> 

控制器:

[HttpPost] 
public ActionResult Search(QuoteSearch search) { 
    // checking if fields are set here. 
} 

我似乎記得有一種存在的方式,以不必使用HTML傭工,但仍使用一個強類型的模型(與FormCollection相反);我認爲它涉及到設置名稱屬性是模型上屬性的確切名稱,但我似乎錯了。

+0

QuoteId輸入是一個錯字? viewmodel包含一個CustomerId屬性 – 2012-07-06 15:53:54

+0

奇怪......你的代碼應該工作(期望你有'QuoteId',但是在你的模型'CustomerId'上)。因爲Html幫助器基本上只是以'name'作爲屬性名來呈現輸入元素。 – nemesv 2012-07-06 15:54:44

+0

嘗試改變'name =「QuoteId」'爲'name =「CustomerId」' – 2012-07-06 16:00:57

回答

1

你的名字並非全部對齊(如註釋中所建議的),但對於排隊的字段,當我執行上述代碼(名稱存在,CustomerId爲空)時,模型正確填充。

你是否設置了一個斷點,並且你知道該代碼正在被命中嗎?

還請確認您的控制器被稱爲行情。即使是這樣,你將得到更好的使用:

<form action="@Url.Action("search", "quotes")" method="POST"> 

...讓路由的工作原理,即使你加地區等的網址助手會根據您的路由規則制定出要求的正確路徑。

最後,如果您沒有在設置了斷點的情況下觸發該執行點,請務必使用F12/dev工具來監視您的網絡請求並確保正在調用正確的地址。上面的代碼片段也應該有助於解決這個問題。

希望有助於一些。

+0

是的,我正在調試它,它是擊中搜索方法,但'QuoteSearch'模型具有所有空值。我使用MVC3作爲Asp.Net網站項目的一部分,所以也許某些東西沒有正確連接? – 2012-07-06 18:13:29

+0

我不知道是不是這樣;我使用了一個空白的MVC3項目,並使用相同的代碼填充它,但在混合網站/ MVC項目中,一切都是空的。 – 2012-07-06 18:20:15

+1

好的...我的直覺是,這絕對是相關的,尤其是如果你有不同版本的版本,Asp.Net特性的版本(如路由,模型綁定等)播放不好。我認爲這是你應該花時間的地方,尤其是如果一個寫過的Mvc項目正在爲你工作。嘗試將端口轉換爲直MVC項目(如果可以的話),或者實現一個解決方案,使您的模型綁定在您的上下文中運行。乾杯。 – MisterJames 2012-07-06 21:54:38

0

嘗試名= 「[視圖模型] [字段名]」 和id = 「[視圖模型] _ [字段名]」

這些都是使用HTML傭工的時候什麼樣的價值觀我在輸入標籤。

所以對你來說將是:

<input type="text" name="QuoteSearch.CustomerId" id="QuoteSearch_CustomerId" /> 

等。