MVC 4 - 在局部视图中使用不同的模型

2024-06-29

请忍受我的noobness,我对 MVC 模式非常陌生。

我正在尝试做什么

我正在为我的网站上的注册用户构建个人资料信息页面。该页面将列出有关用户的数据,例如出生日期、电话号码、订阅状态等。您明白了。我还想要一个表格让用户更改密码、电子邮件地址、个人信息在同一页上.

我的问题

用户的数据通过传递的模型变量来自我的控制器:

public ActionResult Profil()
        {
            var model = db.Users.First(e => e.UserName == WebSecurity.CurrentUserName);
            return View(model);
        }

在我看来,输出如下:

<label>Phone number: </label>
            @if (Model.PhoneNumber != null)
                    {
                        @Model.PhoneNumber
                    }
                    else
                    {
                        <span class="red">You haven't set up your phone number yet. </span>
                    }

用户可以更改其信息的形式将使用另一个模型,ProfileModel。因此,在我看来,基本上我需要使用两种模型,一种用于输出信息,一种用于发布数据。我认为使用部分视图可以实现此目的,但出现此错误:

传入字典的模型项的类型为 'Applicense.Models.User',但是该字典需要一个模型项 输入“Applicense.Models.ProfileModel”。

这是我对部分视图的调用如下所示:

 @using (Html.BeginForm())
    {
        @Html.AntiForgeryToken()
        @Html.ValidationSummary()

        @Html.Partial("_ModifyProfileInfo")
    }

这是部分视图:

@model Applicense.Models.ProfileModel
<ul>
    <li>
        @Html.LabelFor(m => m.Email)
        @Html.EditorFor(m => m.Email)
    </li>
    <li>
        @Html.LabelFor(m => m.ConfirmEmail)
        @Html.EditorFor(m => m.ConfirmEmail)
    </li>
    <input type="submit" value="Update e-mail" />
</ul>

最后这是我的 ProfileModel:

public class ProfileModel
    {
        [Required]
        [DataType(DataType.EmailAddress)]
        [Display(Name = "New e-mail address")]
        public string Email { get; set; }

        [DataType(DataType.EmailAddress)]
        [Display(Name = "Confirm new e-mail address")]
        [Compare("Email", ErrorMessage = "The e-mail and it's confirmation field do not match.")]
        public string ConfirmEmail { get; set; }
    }

我错过了什么吗?执行此操作的正确方法是什么?

Edit:我重新编写了代码以反映 Nikola Mitev 的答案,但现在我遇到了另一个问题。这是我得到的错误:

你调用的对象是空的。 (@Model.UserObject.LastName)

仅当我发布更改后的电子邮件地址值时才会发生这种情况。这是我的 ViewModel(配置文件 Model.cs):

public class ProfileModel
    {
        public User UserObject { get; set; }

        [Required]
        [DataType(DataType.EmailAddress)]
        [Display(Name = "Új e-mail cím")]
        public string Email { get; set; }

        [DataType(DataType.EmailAddress)]
        [Display(Name = "Új e-mail cím megerősítése")]
        [Compare("Email", ErrorMessage = "A két e-mail cím nem egyezik.")]
        public string ConfirmEmail { get; set; }

        [DataType(DataType.EmailAddress)]
        [Display(Name= "E-mail cím")]
        public string ReferEmail { get; set; }
    }

控制器:

public ActionResult Profil()
        {
            var User = db.Users.First(e => e.UserName == WebSecurity.CurrentUserName);

            var ProfileViewModel = new ProfileModel
            {
                UserObject = User
            };

            return View(ProfileViewModel);
        }

最后这是我的user.cs模型类:

[Table("UserProfile")]
    public class User
    {
        [Key]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
        public int UserId { get; set; }
        [Column("UserName")]
        public string UserName { get; set; }
        [Column("Email")]
        [Required]
        public string Email { get; set; }
        [Column("FirstName")]
        public string FirstName { get; set; }
        [Column("LastName")]
        public string LastName { get; set; }
        [Column("PhoneNumber")]
        public string PhoneNumber { get; set; }
... You get the idea of the rest...

我认为这是因为模型试图将数据放入每个required列存入数据库。

Edit2:我的 Profile 操作的 httppost 方法:

[HttpPost]
        [Authorize]
        [ValidateAntiForgeryToken]
        public ActionResult Profil(ProfileModel model)
        {
            if (ModelState.IsValid)
            {
//insert into database
                return Content("everything's good");
            }
            else
            {
//outputs form errors
                return View(model);
            }
        }

处理这种情况的最佳方法是使用 viewModel 并将其传递给您的 Profile 控制器,viewModel 是您想要传递给视图的多个对象的包装类。

public class ProfileUserViewModel
{
   public ProfileModel ProfileModelObject {get; set;}
   public UserModel  UserModelObject {get; set;}
}   

你的控制器应该是这样的:

public ActionResult Profil()
{            
    var profileModel = db.Users.First(e => e.UserName == WebSecurity.CurrentUserName);
    var userModel = //fetch from db.

    var pmViewModel = new ProfileUserViewModel  
                          {
                              ProfileModelObject = profileModel,
                              UserModelObject = userModel
                          };

   return View(pmViewModel);
}

最后是你的观点:

@model Applicense.Models.ProfileUserViewModel

<label>Phone number: </label>

@if (Model.ProfileModelObject.PhoneNumber != null)
{
   @Model.PhoneNumber
}
else
{
    <span class="red">You haven't set up your phone number yet. </span>
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MVC 4 - 在局部视图中使用不同的模型 的相关文章

随机推荐

  • 将我的 JSON 字符串格式化为 PHP 中的
      有序列表

    我正在为一个宠物项目开发一个简单的 CMS 我目前有一个 JSON 字符串 其中包含菜单结构的页面 ID 和父页面 ID 的列表 我现在想将此字符串转换为嵌套或分层列表 有序列表 我尝试过循环查找 但似乎最终得到了过于复杂的子类范围 我正在
  • 扩展 CrudRepository (Spring) 时是否需要 @Repository 注解?

    public interface CarRepository extends CrudRepository
  • 在 ChartJs v2 中显示零值的条形图

    我想知道有没有办法在 ChartJs 条形图中 条形图中显示零值 我的意思是这样的 https jsfiddle net vrg5cnk5 16 https jsfiddle net vrg5cnk5 16 所以第二个条将只是零级上的蓝色边
  • Webpack、Sass - 超出最大调用堆栈大小

    我正在为我的 JS 应用程序使用 Webpack 对于样式 我使用 Sass 我的应用程序非常大 所以我使用了很多 mixins 和 includes 在过去的几天里 虽然应用程序的 SASS 数据增长了一些 我多次遇到相同的以下错误 未捕
  • 搜索/替换 xml 内容

    我已经成功地使用 xml etree ElementTree 解析 xml 搜索内容 然后将其写入不同的 xml 然而 我只是处理单个标签内的文本 import os sys glob xml etree ElementTree as ET
  • UniversalLink 不适用于 iOS 14 设备,但在模拟器上运行良好

    以下解决方案可以在模拟器上支持universalLink 我有一个支持 UniversalLink 的应用程序 用户单击网站中支持的链接 将导航到应用程序中的功能 但它无法在 iOS 14 beta 4 上运行 它不是打开应用程序 而是打开
  • 如何创建像Foursquare兴趣选择屏幕一样的gridview?

    我正在创建一个应用程序 要求用户选择多个兴趣 我正在尝试创建一个类似于 Foursquare 兴趣选择的屏幕类似于标签云其中可以选择多个按钮来代表用户的兴趣 我尝试创建一个 gridview 但无法实现按钮换行到下一行的效果 有没有办法通过
  • 如何在线性布局上制作波纹效果,而不覆盖其子级的背景颜色?

    I have a LinearLayout that looks like this 我希望每一行都是可点击的 这LinearLayout一行的代码如下所示
  • Primefaces 数据表(日期列) 按日历过滤

    I am using PF 5 1 I want to filter Primefaces datatable date column by calendar set primefaces calendar here Is it possi
  • 当为 false 时,Handlebars 不会渲染布尔变量

    Handlebars js 有一些奇怪的行为 它将 true 值渲染为字符串 true 将 false 值渲染为 var booleanTestTrue true var booleanTestFalse false 模板 True boo
  • 在记录活动中使用 readConfiguration 方法

    为了在小型 Java 桌面应用程序中使用日志记录 我试图深入了解一些方法的操作 我使用一个非常愚蠢的小Java程序来测试它们 特别是 在测试 LogManager readConfiguration 方法的行为时 我发现了一些奇怪的事情 在
  • 将文件的 hexdump 或 RAW 数据提取为文本

    我想知道是否有办法将文件的 hexdump 或原始数据输出到 txt 文件 例如 我有一个文件 data jpg 文件类型无关 如何将 HEXdump 14ed 5602 等 导出到文件 output txt 另外我如何指定输出的格式 例如
  • Magento 管理员登录不起作用

    我将我的网站从一个托管提供商迁移到另一托管提供商 当我在更改名称服务器之前更改服务器上的 A 记录时 一切正常 名称服务器更改后 问题开始出现 首先 没有任何链接可用 在询问提供商后 他们说 htaccess 是空白的 他们已经恢复了默认配
  • Ruby 相当于 Python 的多处理模块是什么?

    为了在 Ruby 或 Python 中获得真正的并发性 我需要创建新的进程 Python 使用以下命令使这变得非常简单multiprocessing模块 它抽象了所有 fork wait 的好处 让我专注于我的代码 Ruby 有类似的东西吗
  • 在 ruby​​ on Rails 中运行测试时具有默认端口

    我正在尝试运行我的测试rake spec我使用 rspec capybara 和 selenium 作为网络驱动程序 问题是 当我尝试运行规范时 它每次都会在不同的端口中启动测试环境 我不希望这种情况发生 因为它会扰乱我的 Facebook
  • Eslint 不忽略 node_modules 文件夹

    不知何故更新后Babel from 6 to 7 my eslint开始发出这样的警告node modules 所以 根据我的理解node modules文件夹不会被忽略 这就是问题出现的原因 所以 通读eslint docs https
  • iOS Facebook SDK 通过图搜索来搜索用户

    我是图形搜索新手 我想搜索具有电子邮件地址的用户 那可能吗 现在 我只知道如何使用他们的名字进行搜索 如下所示 https graph facebook com search q chandler de angelis type user
  • jQuery:append() 与appendTo()

    我正在测试 jQuery append vs appendTo 使用以下代码的方法 div gt id id text this text appendTo div type item id div type item id append
  • MIPS 如何分支到32位地址?

    我正在尝试分支到一个地址 bne t0 0 0x7813a21c 然而 这是不正确的 因为 bne 只分配 16 位给立即数 如何分支到直接 32 位地址 有没有办法从寄存器中的值分支 你必须使用JR跳转到寄存器中存储的地址
  • MVC 4 - 在局部视图中使用不同的模型

    请忍受我的noobness 我对 MVC 模式非常陌生 我正在尝试做什么 我正在为我的网站上的注册用户构建个人资料信息页面 该页面将列出有关用户的数据 例如出生日期 电话号码 订阅状态等 您明白了 我还想要一个表格让用户更改密码 电子邮件地