2013-05-10 70 views
0

我試圖建立一個多對多關係的表單,其中團隊可以屬於任何數量的機構,並且機構可以容納任意數量的團隊。GET和POST值未正確映射到方法簽名

我目前的問題與分配一個機構到一個團隊有關。這個想法是在團隊表單上有一個「添加此機構」按鈕的選擇框,這會在控制器中觸發一個「addInstitution」動作。我已經把所有機構成ViewBag的SelectList對象,這是正確顯示在隊伍/編輯動作,與所有當前分配機構一起:

@using (Html.BeginForm("AddInstitution", "Team", new { team = Model.ID }, FormMethod.Post)) 
{ 
    @Html.AntiForgeryToken() 

    <div> 
     Add to institution: 
    </div> 

    <div> 
     @Html.DropDownList("institution", (SelectList)ViewBag.Institutions) 
    </div>  

    <div> 
     <ul> 
      @foreach (var item in Model.Institutions) 
      { 
       <li>@item.InstitutionName</li> 
      } 
     </ul> 
    </div> 

    <div> 
     <input type="submit" value="Add" /> 
    </div> 

} 

顯示此信息工作正常。然而,我的印象是,任何GET或POST參數(團隊和機構)都將映射到接收方法的參數,這就是爲什麼我把團隊放在objectRouteValues表單中,而我期望該機構由選擇框值:

[HttpPost] 
[ValidateAntiForgeryToken] 
public string AddInstitution(Team team, Institution institution) 
{ 
    return "team: " + team.ID + ", institution: " + institution.ID; 
} 

此方法中的兩個參數都爲null。任何人都知道他們爲什麼沒有正確映射到方法簽名?

紅利問題:這是您建立多對多關係表單的首選策略,還是有更好的方法?

+0

我發現如果在方法簽名中用「int」替換對象標識符,它實際上可以工作。這意味着我可以在dbcontext中找到對象,並以這種方式更新它們。但是它不應該能夠從給定簽名的ID實例化對象嗎? – 2013-05-10 16:45:04

+0

我認爲你不能在你使用它的方式在相同的視圖上處理兩個模型 – 2013-05-10 16:45:57

+0

我只將一個模型分配給視圖,並將一個SelectList分配給ViewBag。 – 2013-05-10 16:54:40

回答

0

好,所以我並不完全清楚一切。我真的很想看看你的頁面模型是如何定義的。

您可以使用FormCollection來獲取表單中的所有內容。

public string AddInstitution(Team team, FormCollection frm) 
{ 
//you should just get frm["institution"] but I'm not super sure, 
//put a breakpoint and use the immediate window and inspect frm. 
} 

正確的方法做,這是代表一切您認爲有視圖模型內。您應該每頁只有一個ViewModel。

+0

即使萬一View具有強類型模型? – 2013-05-10 17:19:45

+0

@ewvfwrwwvw你是什麼意思? ViewModel是表示視圖的模型或普通類(通常無行爲)。所以它應該涵蓋所有的觀點。您可以有一個單獨的**數據模型**,它表示您的數據庫模式以及兩者之間的轉換。 – gideon 2013-05-10 17:22:28

+0

我的意思是,這是一個選擇。根源是什麼? – 2013-05-10 17:23:31

0

您的行動的團隊和機構參數是類。您必須爲該類的至少一個屬性提供輸入字段,而不是爲類/參數名稱本身提供輸入字段。

例如,綁定到團隊參數的ID屬性,你可以使用一個名爲team.Id一個隱藏字段:

@using (Html.BeginForm("AddInstitution", "Team", FormMethod.Post)) 
{ 
    @Html.Hidden("team.Id", Model.ID) 
} 

出於同樣的規則適用於該機構的參數。你必須調用現場institution.Id

@Html.DropDownList("institution.Id", (SelectList)ViewBag.Institutions) 

這樣一來,ModelBinder的將創建類的實例並分配形式值的ID屬性。