在单个视图中传递多个视图模型

问题描述:

尽管我相信我已定义所有模型并希望正确传入,但我得到一个错误,指出我需要另一个模型时传入一个模型。在单个视图中传递多个视图模型

主视图:

@model Project.Models.ProfileModel 

@(ViewBag.HasLocalPassword ? Html.Partial("_ChangePasswordPartial", Model.PasswordModel) : Html.Partial("_SetPasswordPartial", Model.PasswordModel)) 

      @Html.Partial("_UsernamePartial", Model.UsernameModel) 
      @Html.Partial("_PlayNamePartial", Model.PlayNameModel) 

型号:

public class ProfileModel 
{ 
    public PasswordModel PasswordModel { get; set; } 
    public PlayNameModel PlayNameModel { get; set; } 
    public UsernameModel UsernameModel { get; set; } 
} 

用户名行动GET:

public ActionResult _UsernamePartial() 
    { 
     var usernameModel = new UsernameModel(); 
     using (var db = new DataContext()) 
     { 
      usernameModel.Username = 
       (from u in db.Users where u.ID == WebSecurity.CurrentUserId select u.Username).FirstOrDefault(); 
     } 
     return PartialView(usernameModel); 
    } 

用户名POST操作:

[HttpPost] 
    public ActionResult _UsernamePartial(UsernameModel usernameModel) 
    { 
     if (ModelState.IsValid) 
     { 
      using (var db = new DataContext()) 
      { 
       User user = db.Users.FirstOrDefault(u => u.ID == WebSecurity.CurrentUserId); 
       user.Username = usernameModel.Username; 
       db.SaveChanges(); 
      } 
     } 
     return View("_UsernamePartial"); 
    } 

配置文件操作:

public ActionResult Profile(ManageMessageId? message) 
    { 
     var profile = New ProfileModel(); 
     ViewBag.StatusMessage = 
      message == ManageMessageId.ChangePasswordSuccess ? "Your password has been changed." 
      : message == ManageMessageId.SetPasswordSuccess ? "Your password has been set." 
      : message == ManageMessageId.RemoveLoginSuccess ? "The external login was removed." 
      : ""; 
     ViewBag.HasLocalPassword = OAuthWebSecurity.HasLocalAccount(WebSecurity.GetUserId(User.Identity.Name)); 
     ViewBag.ReturnUrl = Url.Action("Profile"); 
     return View(profile); 


    } 

查看页面输入用户名:

@model Acatar.Models.UsernameModel 

@using (Html.BeginForm("_UsernamePartial", "Account")) { 

     <p id="legend">Username</p> 
     @Html.TextBoxFor(m=>m.Username) 

    <button type="submit" value=" Username">Save</button> 
} 

错误消息:The model item passed into the dictionary is of type 'Project.Models.ProfileModel', but this dictionary requires a model item of type 'Project.Models.UsernameModel'.

真的很感激,我要去的地方错误的任何帮助。

+0

到什么视图页面,你真的看到这个错误? – bot 2013-02-12 05:54:34

+0

@bot在主视图页上 - 代码的第一部分我有。我是否应该将三个模型的所有GETS传递给Profile页面中的一个GET方法? – BB987 2013-02-12 05:58:04

+0

@ BB987,不,你不必将所有获取发布到同一页面。有趣的是,你有一个从不使用的_UsernamePartial的子方法。不涉及你的问题,但有趣的是,OIC,@ BB987的 – 2013-02-12 06:00:41

如果你打电话Html.Partial我不相信它调用的操作方法。你应该使用Html.RenderAction()来调用控制器动作。

+0

我不认为这是@ BB987打算使用他的部分与Child Actions。我可能是错的,但我认为他的意图是将渲染后的表单发布到以相应视图命名的Actions上。这将是初学者对公约的误解。我认为... – 2013-02-12 06:08:35

+0

好的,所以我得到这个权利 - 我将在配置文件(主视图)中使用Html.RenderAction()? – BB987 2013-02-12 06:16:12

+1

这并不能解决你所有的问题。除非它返回一个usernameModel,否则不应将表单发布到_UsernamePartial。该方法将“绑定”到您的部分,并尝试呈现它。但是你的部分期望一个类型为usernameModel的模型。 – 2013-02-12 06:19:06

当您发布到_UsernamePartial时,它充当一个返回另一个部分的子操作方法。您传回

您有效地回传查看_UsernamePartial但它返回

return View("_UsernamePartial"); 

没有usernameModel

+1

@ BB987,阅读这篇贴子和孩子的动作,应该澄清很多http://www.arrangeactassert。com/when-to-use-html-renderpartial-and-html-renderaction-in-asp-net-mvc-razor-views/ – 2013-02-12 06:22:43