Asp.net 在单个视图中传递多个视图模型
尽管我相信我已经定义了所有的模型,并且希望能够正确地传入,但是我得到了一个错误,它表明我传入了一个模型,而它需要另一个模型 主要观点:Asp.net 在单个视图中传递多个视图模型,asp.net,view,asp.net-mvc-4,viewmodel,asp.net-mvc-viewmodel,Asp.net,View,Asp.net Mvc 4,Viewmodel,Asp.net Mvc Viewmodel,尽管我相信我已经定义了所有的模型,并且希望能够正确地传入,但是我得到了一个错误,它表明我传入了一个模型,而它需要另一个模型 主要观点: @model Project.Models.ProfileModel @(ViewBag.HasLocalPassword ? Html.Partial("_ChangePasswordPartial", Model.PasswordModel) : Html.Partial("_SetPasswordPartial", Model.PasswordMode
@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; }
}
用户名操作获取:
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);
}
用户名后操作:
[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>
}
@model Acatar.Models.UsernameModel
@使用(Html.BeginForm(“\u usernameportial”,“Account”)){
用户名
@Html.TextBoxFor(m=>m.Username)
拯救
}
错误消息:传递到字典中的模型项类型为“Project.Models.ProfileModel”,但此字典需要类型为“Project.Models.UsernameModel”的模型项。
如果你能告诉我哪里出了问题,我将不胜感激 当您发布到
\u usernameportial
时,它充当返回另一部分的子操作方法。你要回去了
您实际上是在传回视图_usernameportial,但返回它
return View("_UsernamePartial");
当您发布到
\u usernameportial
时,如果没有usernameModel,这将充当返回另一部分的子操作方法。你要回去了
您实际上是在传回视图_usernameportial,但返回它
return View("_UsernamePartial");
如果调用Html.Partial,没有usernameModel,我不相信它会调用action方法。您应该使用Html.RenderAction()调用控制器操作。如果您调用Html.Partial,我不相信它会调用操作方法。您应该使用Html.RenderAction()来调用控制器操作。在主视图页上的@bot中,您实际看到了哪个视图页的错误?这是我的第一段代码。我是否应该在配置文件页面中将三个模型的所有GET传递到一个GET方法中?@BB987,不,您不必将所有GET都发布到同一页面。有趣的是,您有一个从未使用过的UsernamePartial的子方法。与您的问题无关,但有趣的是,@BB987,您无意中创建了子操作方法。您可以用partials命名操作方法。你的意图是(通过表面上的惯例)向他们发帖。但它们实际上试图返回部分。@DaveA我的总体问题是,在使用textbox进行页面加载之前,我希望用以前保存的数据对它们进行预填充,但它没有这样做,因为它得到了一个空引用,所以没有显示任何内容。但在检查数据库中的更改后,它已正确保存。您实际在哪个视图页上看到了该错误?@bot在主视图页上-这是我的第一段代码。我是否应该在配置文件页面中将三个模型的所有GET传递到一个GET方法中?@BB987,不,您不必将所有GET都发布到同一页面。有趣的是,您有一个从未使用过的UsernamePartial的子方法。与您的问题无关,但有趣的是,@BB987,您无意中创建了子操作方法。您可以用partials命名操作方法。你的意图是(通过表面上的惯例)向他们发帖。但它们实际上试图返回部分。@DaveA我的总体问题是,在使用textbox进行页面加载之前,我希望用以前保存的数据对它们进行预填充,但它没有这样做,因为它得到了一个空引用,所以没有显示任何内容。但在检查了数据库中的更改后,它被正确地保存了下来。我认为@BB987无意在子操作中使用他的partials。我可能错了,但我认为他的意图是让呈现的表单发布到以相应视图命名的动作中。这将是初学者对传统的误解。我想…好吧,我说对了-我将在概要文件(主视图)中使用Html.RenderAction()?这不会解决所有问题。除非表单返回usernameModel,否则不应将表单发布到_UsernamePartial。该方法将“绑定”到您的分部,并将尝试渲染它。但您的分部需要usernameModel类型的模型。@DaveA。哇!我刚刚注释了我的post方法并运行了该页面,现在它可以完美地工作了。但是,如果用户更改了
username
并进行了保存,我是否仍然需要该帖子才能保存到数据库中?还是这样做了differently@BB987是的,您应该发布,但是对于父视图Methodos,永远不要发布到以分部命名的方法,除非您想使用该方法调用分部。阅读我的答案下面的链接。它解释了你的动作和部分动作之间的联系。这说明了Paul告诉你的。我不认为@BB987打算在儿童行为中使用他的partials。我可能错了,但我认为他的意图是让呈现的表单发布到以相应视图命名的动作中。这将是初学者对传统的误解。我想…好吧,我说对了-我将在概要文件(主视图)中使用Html.RenderAction()?这不会解决所有问题。除非表单返回usernameModel,否则不应将表单发布到_UsernamePartial。该方法将“绑定”到您的分部,并将尝试渲染它。但您的分部需要usernameModel类型的模型。@DaveA。哇!我刚刚注释了我的post方法并运行了该页面,现在它可以完美地工作了。但是,如果用户更改了username
并进行了保存,我是否仍然需要该帖子才能保存到数据库中?还是这样做了differently@BB987是的,您应该发布,但是对于父视图Methodos,永远不要发布到以分部命名的方法,除非您想使用该方法调用分部。阅读我的答案下面的链接。它解释了你的动作和部分动作之间的联系。这说明了Paul wa