2011-09-20 51 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