【问题标题】:Passing multiple view models in a single view在单个视图中传递多个视图模型
【发布时间】:2013-02-12 05:48:49
【问题描述】:

尽管我相信我已经定义了所有模型并希望正确传递,但我收到一个错误,指出我在需要另一个模型时传递一个模型。

主视图:

@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'.

非常感谢任何关于我哪里出错的帮助。

【问题讨论】:

  • 到哪个视图页面,您实际上会看到该错误?
  • @bot 在主视图页面上 - 我拥有的第一部分代码。我是否应该将三个模型的所有 GETS 传递到 Profile 页面中的一个 GET 方法中?
  • @BB987,不,您不必将所有获取发布到同一页面。有趣的是,您有一个从未使用过的 _UsernamePartial 子方法。与您的问题无关,但很有趣
  • OIC,@BB987,您无意中创建了子操作方法。你用你的局部命名你的动作方法。您的意图是(按照惯例)向他们发帖。但他们实际上试图归还 Partials。
  • @DaveA 我对此的总体问题是,在我用文本框加载我的页面之前,但我希望它们预先填充以前保存的数据,但它没有这样做,因为它正在获取一个空引用,所以什么都没有显示。但是在检查数据库更改后它可以正确保存。

标签: asp.net view asp.net-mvc-4 viewmodel asp.net-mvc-viewmodel


【解决方案1】:

当您发布到_UsernamePartial 时,这充当返回另一个 Partial 的子操作方法。你要回来了

您实际上是在返回 View _UsernamePartial 但返回它

return View("_UsernamePartial");

没有 usernameModel

【讨论】:

【解决方案2】:

如果您调用 Html.Partial 我不相信它会调用操作方法。您应该使用 Html.RenderAction() 来调用控制器操作。

【讨论】:

  • 我不认为@BB987 打算将他的部分内容与子操作一起使用。我可能是错的,但我认为他的意图是将呈现的表单发布到以相应视图命名的操作。这将是初学者对约定的误解。我认为...
  • 好的,我做对了 - 我将在配置文件(主视图)中使用 Html.RenderAction()?
  • 这并不能解决你所有的问题。您不应该将您的表单发布到 _UsernamePartial,除非它返回一个 usernameModel。该方法将“绑定”到您的部分,并尝试渲染它。但是您的部分需要一个 usernameModel 类型的模型。
  • @DaveA。哇!我刚刚注释掉了我的 post 方法并运行了该页面,现在它可以正常工作了。但是,如果用户对username 进行更改并保存 - 我是否还需要 POST 才能保存到数据库?还是这样做的方式不同
  • @BB987 是的,您应该发布但要发布到父视图方法,除非您想使用该方法来调用部分,否则不要发布到以部分命名的方法。阅读我的答案下方包含的链接。它解释了你不小心在你的动作和部分之间建立的关联。它说明了保罗告诉你的内容。
猜你喜欢
  • 2011-12-21
  • 1970-01-01
  • 1970-01-01
  • 2020-02-19
  • 2018-01-18
  • 2014-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多