1

我浏览了各种教程,但我对如何执行我的想法感到非常困惑,并希望得到一些帮助来澄清我的想法。

我将有一个名为的剃须刀视图页面Profile;在该个人资料页面上,我有四个不同的部分:

  1. 密码更改
  2. 设置密码
  3. 用户名
  4. 传。

我正在考虑将四个部分中的每一个都创建为部分部分,每个部分都有文本框和一个保存按钮,允许用户添加或更改信息。

@model Projects.Models.PasswordModel
@{
    ViewBag.Title = "Profile Account";
}

<hgroup class="title">
    <h1>@ViewBag.Title.</h1>
</hgroup>

<p class="message-success">@ViewBag.StatusMessage</p>


<div id="wrap">
    <div id="right">
        @if (ViewBag.HasLocalPassword)
        {
            @Html.Partial("_ChangePasswordPartial")
        }
        else
        { 
            @Html.Partial("_SetPasswordPartial")
        }
    </div>

    <div id="left">
        @Html.Partial("_UserNamePartial")
        @Html.Partial("_BiographyPartial")
    </div>
</div>

如何正确设置主视图页面并正确显示四个部分并正常运行?我让它们显示出来,但是当我尝试保存对用户名所做的更改时,我会收到一个不同模型的错误——比如传记模型。我觉得他们在不应该连接的时候被连接了。我真的在寻找一个关于如何去做的清晰的教程,希望我能在弄清楚这一点后做出一个。

这是我的部分用户名

@model Project.Models.UsernameModel

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

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

    <button class="btn btn-small" type="submit" value="Save Username">Save</button>
}

我的控制器

得到:

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

邮政:

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

非常感谢您的帮助。

4

1 回答 1

1

您需要确保您的视图输入到正确的模型。您的视图当前输入到PasswordModel模型中,这似乎是您页面的一部分。如果您为每个部分创建一个由模型组成的模型,它将使这更容易:

class ProfileModel {
    PasswordModel Password { get; set; }
    BiographyModel Biography { get; set; }
    ...
}

然后,您可以将 Profile 视图设置为ProfileModel. 然后您可以将每个模型传递给部分:

@Html.Partial("_BiographyPartial",Model.Biography)

一个例子 _BiographyPartial 看起来像:

@model Projects.Models.BiographyModel
...
<h1>@Model.SomeBiographyProperty</h2>

您应该小心检查您的验证(假设您有一些验证)是否在此设置下正常工作。

或者,您可以将所有数据放入一个平面模型中,并将整个模型传递给每个局部视图。

编辑:部分视图不受控制器和操作的支持,它们只是使用您从调用视图传递给它们的数据呈现的视图。你现在要做的是渲染_UsernamePartial动作。如果你想这样做,你可以尝试使用Action而不是Partial

<div id="left">
    @Html.Action("_UserNamePartial")
    ...
</div>

并将该动作呈现为局部视图:

public ActionResult _UsernamePartial()
{
    var usernameModel = new UsernameModel();
    using (var db = new DataContext())
    {
        usernameModel.Nickname = (from u in db.Users
                                  where u.ID == WebSecurity.CurrentUserId
                                  select u.Username).FirstOrDefault();
    }
    return PartialView(usernameModel);
}
于 2013-02-11T03:35:03.707 回答