2011-09-20 82 views
0

我有一個設置操作在我的帳戶控制器呈現設置視圖。Razor部分模型從ViewModel

在設置視圖上,我收到包含ChangePasswordModel的ViewModel。

這裏是SettingsViewModel:

public class SettingsViewModel 
{ 
    public ChangePasswordModel ChangePasswordModel { get; set; } 
} 

設置視圖臨危

@model XBLTools.Models.SettingsViewModel 

的ChangePassword查看臨危

@model XBLTools.Models.ChangePasswordModel 

的ChangePassword視圖單獨工作確定。 如何渲染傳遞Model.ChangePasswordModel的ChangePassword視圖?

我已經嘗試了一些組合沒有成功獲得不同的錯誤:

@Html.RenderPartial("ChangePassword", (XBLTools.Models.ChangePasswordModel)(Model.ChangePasswordModel)) 

@Html.RenderPartial("ChangePassword", Model.ChangePasswordModel) 

@Html.Partial("ChangePassword", (XBLTools.Models.ChangePasswordModel)(Model.ChangePasswordModel)) 

@Html.Partial("ChangePassword", Model.ChangePasswordModel) 

任何想法?

+0

你ChangePasswordModel爲空嗎? –

+0

是的。這是第一次呈現設置視圖。 – programad

+0

'@ Html.RenderPartial(「ChangePassword」,Model.ChangePasswordModel)'應該可以正常工作,您可以發佈使用它時得到的錯誤嗎? –

回答

2

如果是空傳中ChangePasswordModel的新實例:

@Html.RenderPartial("ChangePassword", new ChangePasswordModel()) 

還是在SettingsViewModel的構造函數初始化它:

public class SettingsViewModel 
{ 
    public SetttingsViewModel() 
    { 
     ChangePasswordModel = new ChangePasswordModel(); 
    } 
    public ChangePasswordModel ChangePasswordModel { get; set; } 
} 
1

您只需通過你的模型屬性:

@Html.Partial("ChangePassword", Model.ChangePasswordModel) 

如果ChangePasswordModel廣告載體是null,你會得到一個錯誤,因爲局部視圖需要一個模型。
確保您已將ChangePasswordModel屬性設置爲實例。

或者,你可以通過一個新的ChangePasswordModel實例:

@Html.Partial("ChangePassword", new ChangePasswordModel()) 
+0

它說:「錯誤CS0118:'System.Web.Mvc.WebViewPage .Model是一個屬性,但用於類型」 – programad

+0

對不起;我誤解了。你可以傳遞模型屬性。請注意,該屬性不能爲空。 – SLaks

1

你應該初始化ChangePasswordModel上的設置控制器視圖模型。

public ActionResult MyAction() 
{ 

    var model = new SettingsViewModel{ 
      ChangePasswordModel = new ChangePasswordModel() 
     } 
    return View(model); 

} 

然後使用:

@Html.Partial("ChangePassword", Model.ChangePasswordModel) 
+0

這工作。我不得不刪除Settings動作也收到的參數(SettingsViewModel模型)。也許「初始行動」不需要接收模型,只需渲染爲空。是對的嗎? – programad