2012-07-11 86 views
1

我在我稱爲「DirectorySearchController」控制器此方法Html.Actionlink傳遞空值到控制器

public ActionResult PersonDetails(FoundPerson person) //for some reason person is null here 
{ 
    DirectoryViewModel viewModel = new DirectoryViewModel(); 
    viewModel.person = person; 
    return View(viewModel); 
} 

當我通過一些參數,將其從使用Html.Actionlink視圖它返回一個空值

<ul data-role="listview"> 
    @if (ViewBag.Message == "NO RESULTS FOUND") 
    { 
     <li>@ViewBag.Message</li> 
    } 
    else 
    { 
      foreach (var employee in Model) 
      { 
       <li> 
        <div class="ui-grid-b"> 
         <div class="ui-block-a" style="width:20%; vertical-align:middle"><img src="@employee.pictureURL" width="40px" height="40px"/></div> 
         <div class="ui-block-b" style="width:80%; vertical-align:middle">@Html.ActionLink(employee.name, "PersonDetails", "DirectorySearch", new { person = employee}, null)</div> 
        </div> 
       </li> 
      } 
    } 


</ul> 

但有趣的是,當我通過參數而不使用「新」關鍵字它傳遞正確的值。但是,問題是我需要傳遞多個參數,所以我需要使用「新」關鍵字。

<div class="ui-block-b" style="width:80%; vertical-align:middle">@Html.ActionLink(employee.name, "PersonDetails", "DirectorySearch", employee, null)</div> 
+0

我有完全相同的問題 - 如果我指定控制器方法需要的參數,它會抱怨空值,但如果我傳遞該對象,它會奇蹟般地選擇正確的對象屬性。瘋! – 2012-11-29 10:46:10

回答

1

我認爲你沒有使用正確的ActionLink重載。嘗試使用其中任一

第一個應該根據自己的情況下,大多工作:

<%=Html.ActionLink(employee.Name, "PersonalDetails", "DirectorySearch", new { person = employee }, null)%> 

<%=Html.ActionLink(employee.Name, "PersonalDetails", new {person = employee})%> 

就在這裏建議。理想情況下,我會使用輸入提交將數據發佈到控制器。您可以在控制器端使用Model類或FormCollection來檢索您在視圖中輸入的值。

+0

感謝CodeMaid,我試過了,但它仍然沒有與任何一個工作 雖然兩個問題: 1)使用<%= ... %>語法與上面我有什麼有區別嗎? 2)我在這個視圖上沒有任何形式,我從另一個控制器方法傳遞一個對象列表到視圖。我仍然可以使用你的建議嗎? – 2012-07-11 16:16:03

+0

你有工作嗎? – CodeMad 2012-07-11 16:17:27

+0

lol not yet .... – 2012-07-11 16:37:05

0

您不應該將模型傳遞給控制器​​操作,如new { person = employee },其中Html.ActionLink。因爲發生的情況是,當您生成操作鏈接時,您傳遞的對象將轉換爲RouteValueDictionary,該對象將傳遞到UrlHelper以將路由字典值附加到鏈接。

當你像第一個例子那樣傳遞一個匿名對象時,RouteValueDictionary存儲一個名稱爲person的參數,並設置它看到你傳遞了一個對象的值,它不能序列化整個實例並將其設置爲單一財產,所以它只是將模型Employee的類型名稱設置爲該人的價值。所以,你會看到生成的鏈接爲的http:// someserver/DirectorySearch/PersonDetails人= Models.Employee

如果你傳遞一個實例就像你在第二種情況下沒有那麼它遍歷所有屬性,並創建密鑰? /值對,而鍵是屬性名稱,值是屬性值,最後它們都作爲querystrings附加到鏈接。在這種情況下所生成的URL將被HTTP:// someserver/DirectorySearch/PersonDetails Property1 =值1 & Property2 =值2

正確

@Html.ActionLink(employee.name, "PersonDetails", "DirectorySearch", employee, null) 

錯誤

@Html.ActionLink(employee.name, "PersonDetails", "DirectorySearch", new {person = employee }, null) 

您可以使用匿名對象將路由參數傳遞到操作鏈接,但是在您的時間d不通過參考類型,但是內置類型如整數,字符串..

Ex。

​​
+0

感謝馬克, 那麼以上述正確的方式傳遞多個參數呢? – 2012-07-11 16:22:07

+0

我更新了我的答案,請檢查。 – VJAI 2012-07-11 16:25:44

+0

當您傳遞匿名對象時,您將參數設置爲與字典類似的鍵/值對,因此您只能看到一個名爲「person」的querystring參數,但當您傳遞實例時,所有屬性都會轉換爲查詢字符串參數,這就是模型綁定需要。 – VJAI 2012-07-11 16:29:37