2013-02-18 52 views
0

正常情況下,當我設計一個表單時,我期望的數據是該頁面的視圖模型的一部分,我可以將該類放在控制器方法中,並且綁定起作用。如何綁定到不在我的模型中的asp.net mvc 2中的類?

但是,我在母版頁的局部視圖中添加了一個表單,所以它不是特定於任何一個視圖模型。我試圖確保表單字段的ID與通常會自動生成的內容匹配,但對象值在我的控制器方法中始終爲空。

這裏是一個片段構成了我我的母版頁的局部視圖:

  <tr> 
       <td >Current password:</td> 
       <td><%= Html.Password("PasswordChange.OriginalPassword", "", new RouteValueDictionary { { "class", "required remote" } })%></td> 
      </tr>    
      <tr> 
       <td >New password:</td> 
       <td><%= Html.Password("PasswordChange.NewPassword", "", new RouteValueDictionary { { "class", "required remote" } })%></td> 
      </tr> 

正如你可以看到可以想象,PasswordChange是不是所有的我的視圖模型的一部分(當然這是沒有必要繼承我所有的視角模型都來自一個共同的基礎,以便使用這種形式?)。

我控制器的方法是這樣的:

[HttpPost] 
     public ActionResult ChangePassword(PasswordChange PasswordChange) 
     { 

我打的方法,但PasswordChange.OriginalPassword和PasswordChange.NewPassword總是空。

我認爲有一些簡單的方法來做到這一點,但我無法弄清楚。

回答

2

擺脫前綴:

<tr> 
    <td>Current password:</td> 
    <td><%= Html.Password("OriginalPassword", "", new RouteValueDictionary { { "class", "required remote" } })%></td> 
</tr>    
<tr> 
    <td >New password:</td> 
    <td><%= Html.Password("NewPassword", "", new RouteValueDictionary { { "class", "required remote" } })%></td> 
</tr> 

,或者如果你想保持一個前綴,請確保你定義了這個前綴:

[HttpPost] 
public ActionResult ChangePassword(
    [Bind(Prefix = "PasswordChange")] PasswordChange model 
) 
{ 
    ... 
} 

通過你也可以考慮使用童工的行爲方式取而代之的是:

public class PasswordChangeController: Controller 
{ 
    [ChildActionOnly] 
    public ActionResult Index() 
    { 
     var model = new PasswordChange(); 
     return PartialView(model); 
    } 
} 

然後在你的masterpage裏面而不是渲染一個partial,渲染ch ILD行動:

<% Html.RenderAction("Index", "PasswordChange"); %> 

,當然現在你將有一個強類型~/Views/PasswordChange/Index.ascx部分在那裏你可以生成表單,並使用助手的強類型版本。

有關子動作的更多信息,您可以查看關於此主題的Phil Haack的blog post

+0

感謝達林,但我想我只是發現問題的根源。 :-(查看我的回答 – pc1oad1etter 2013-02-18 17:05:25

+0

這是OP要求的答案,他發現另一個答案並沒有改變這個事實 – 2013-02-18 17:27:34

+0

@DaveA我不確定你的觀點是什麼,但我很樂意收到這個答案我的發現只不過是我以一種可行的方式做了一切事情,除了我的財產是私人的,前綴似乎並不是障礙。我會閱讀ChildActions,謝謝。 – pc1oad1etter 2013-02-18 17:44:19

0

我的PasswordChange類的成員沒有設置爲公共。

@%$#$ ^#%&%

public class PasswordChange 
    { 
     public OriginalPassword { get; set; } 
     public NewPassword { get; set; } 
    } 

public class PasswordChange 
    { 
     public string OriginalPassword { get; set; } 
     public string NewPassword { get; set; } 
    }