2014-01-08 122 views
2

好吧,類似的問題已經發布,但我沒有看到一個適用於這種情況的答案,或者更可能的,我完全理解答案!爲什麼空模型返回到post方法?

基本上我有一個get ViewResult和Post ActionResult,獲取返回正確的模型,但是當提交時,模型返回所有​​屬性爲null? 在其他方法有用戶類似的代碼,它的工作原理,任何人都可以看到問題? 還在學習,所以請解釋任何答案,謝謝。

  [HttpGet] 
    public ViewResult DeleteUser(string username) 
    { 
     IQueryRunner<User> getUser = new NhQueryRunner<User>(); 
     User user = getUser.GetQueryResult(new GetNamedEntity<User>(username)); 

     ViewUserModel model = Mapper.Map<User, ViewUserModel>(user); 

     return View("DeleteUser", model); 
    } 

    [HttpPost] 
    public ActionResult DeleteUser(ViewUserModel model) 
    { 
    } 

查看

@using (Html.BeginForm("DeleteUser", "Company", FormMethod.Post)) 
{ 
<fieldset> 
    Are you sure you want to delete Username - @Html.DisplayFor(m => m.Name) 
    <input type="submit" value="Remove User"/> 
</fieldset> 
} 

回答

1

表單從其輸入中提交值。您沒有名稱與模型屬性名稱相同的輸入,因此提交的表單數據不包含這些值。其他value providers(查詢字符串,路由數據等)也沒有對應於模型屬性的值。因此,模型聯編程序無法綁定值,並且您的模型的所有屬性都等於null(它們是引用類型屬性)。

您可以使用@ Html.HiddenFor(M => m.Name)`由@邁克爾的建議來生成表單中的隱藏輸入:

<input id="Name" type="hidden" value="username_value" name="Name"> 

現在,如果你檢查Request.Form值集合,它將包含輸入密鑰Nameusername_value的值。 FormValueProvider提供對此集合的訪問以建模活頁夾。名稱爲Name的房產將被成功綁定。

+0

這似乎是'name'而不是'username' –

+0

@YairNevet謝謝,剛纔看到Get方法參數寫回答時,現在更新 –

+0

如何檢查Request.Form值集合?我假設我也保留了我的原始輸入標記行? – mkell

2

因爲有在表格模型的屬性沒有input控制你得到一個空的模型。即使DisplayFor也不會在POST中返回一個值。我建議您這樣做:

@Html.HiddenFor(m => m.Property1) 
@Html.HiddenFor(m => m.Property2) 
@Html.HiddenFor(m => m.Property3) 

... 

其中Property{n}是模型上的屬性。

+0

感謝邁克爾,我敢肯定,這就是解決方案,但我打了一個錯誤到達後方法之前,「值不能爲null.Parameter名稱:鍵」,(沒有與模型一起列出的「鑰匙」)我將不得不做更多的挖掘工作,但是我認爲程序會在提交後馬上觸發Post方法的斷點?.....歡呼聲 – mkell

1

您需要在表單部分有一個表單輸入元素,以便瀏覽器可以回發到服務器。更新您的代碼,並添加以下屬性

@using (Html.BeginForm("DeleteUser", "Company", FormMethod.Post)) 
{ 
<fieldset> 
    Are you sure you want to delete Username - @Html.DisplayFor(m => m.Name) 
    @Html.HiddenFor(x=>x.Name) 
    <input type="submit" value="Remove User"/> 
</fieldset> 
}