在单个视图中传递多个视图模型
尽管我相信我已定义所有模型并希望正确传入,但我得到一个错误,指出我需要另一个模型时传入一个模型。在单个视图中传递多个视图模型
主视图:
@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'.
真的很感激,我要去的地方错误的任何帮助。
如果你打电话Html.Partial我不相信它调用的操作方法。你应该使用Html.RenderAction()来调用控制器动作。
我不认为这是@ BB987打算使用他的部分与Child Actions。我可能是错的,但我认为他的意图是将渲染后的表单发布到以相应视图命名的Actions上。这将是初学者对公约的误解。我认为... – 2013-02-12 06:08:35
好的,所以我得到这个权利 - 我将在配置文件(主视图)中使用Html.RenderAction()? – BB987 2013-02-12 06:16:12
这并不能解决你所有的问题。除非它返回一个usernameModel,否则不应将表单发布到_UsernamePartial。该方法将“绑定”到您的部分,并尝试呈现它。但是你的部分期望一个类型为usernameModel的模型。 – 2013-02-12 06:19:06
当您发布到_UsernamePartial
时,它充当一个返回另一个部分的子操作方法。您传回
您有效地回传查看_UsernamePartial但它返回
return View("_UsernamePartial");
没有usernameModel
@ 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
到什么视图页面,你真的看到这个错误? – bot 2013-02-12 05:54:34
@bot在主视图页上 - 代码的第一部分我有。我是否应该将三个模型的所有GETS传递给Profile页面中的一个GET方法? – BB987 2013-02-12 05:58:04
@ BB987,不,你不必将所有获取发布到同一页面。有趣的是,你有一个从不使用的_UsernamePartial的子方法。不涉及你的问题,但有趣的是,OIC,@ BB987的 – 2013-02-12 06:00:41