【问题标题】:MVC - Returning a model from controller for Edit ProfileMVC - 从控制器返回模型以进行编辑配置文件
【发布时间】:2014-06-22 22:28:27
【问题描述】:

我是 MVC 新手,没有找到关于将类型化模型返回到视图的正确方法的示例。我需要创建一个视图以允许经过身份验证的用户编辑他们的一些个人资料。

作为测试,我创建了一个控制器操作,该操作返回一个 ApplicationUser 模型和在表单字段中显示配置文件的视图页面。这可行,但它包含所有用户配置文件,这不是我想要的。为了测试我写了以下内容:

Public ActionResult EditProfile()
{
    ApplicationUser user = UserManager.FindById(User.Identity.GetUserId());

    return View(user)
}

当然,这确实有效,我意识到我可以在视图中显示我喜欢的任何内容,但我不确定当我只需要允许时将所有用户的个人资料返回到视图是否是最佳做法编辑他们的一些设置。

所以我创建了一个新的 ViewModel,其中只有所需的字段和一个基于该模型的新视图。它有效,但我仍然觉得我做得不好。在控制器操作中,我这样做了:

public ActionResult EditProfile()
{
    ApplicationUser user = UserManager.FindById(User.Identity.GetUserId());
    EditProfileViewModel model = new EditProfileViewModel();

    model.Email = user.Email;
    model.Company = user.Company;
    model.Name = user.Name;
    model.PhoneNumber = user.PhoneNumber;
    model.CountryCode = user.CountryCode;
    model.StateProvince = user.StateProvince;
    model.Language = user.Language;
    model.StateProvinceCode = user.StateProvinceCode;

    return View(model);
}

这似乎是不必要和可怕的维护。我很抱歉问了这么一个基本的问题。老实说,我在网上搜索了一些例子,我知道它们在那里,但我没有找到我认为适用于我的问题的内容。

顺便说一句,控制器用 [Authorize] 装饰,因此我假设此操作/视图只能由经过身份验证的用户访问。

如果有人可以向我展示一个填充模型并将其传递给控制器​​的正确方法的示例,我会更好地理解。看来这应该只需要几行代码就可以完成。

【问题讨论】:

  • 在接收域模型的视图模型中放置一个构造函数。更容易维护。新的 EditProfileViewModel(user);

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


【解决方案1】:

嗯,首先没有什么可担心的,因为一切都在服务器端处理。如果您想创建自定义模型,它似乎超载,因为您现在必须再做 2 次交易

  1. 将数据从原始模型复制到自定义模型。
  2. [HttpPost] 操作中,您必须获取原始模型数据并覆盖自定义模型中新更新的字段。

如果您使用原始模型更好,只需在视图中获取必要的字段,在[HttpPost] 操作中您需要获取原始记录并替换视图中的字段。

【讨论】:

  • 您是说我的第一种方法是可以接受的(让用户返回视图),而我唯一需要担心的是向用户显示必要的字段?我绝对喜欢这样,这样维护起来会容易得多。我只是不认为这是正确的方法。学习曲线...:S
  • 是的,但是如果您在客户端使用 ajax,在这种情况下您需要使用自定义模型。但这里很好
  • 哦,这大大简化了事情和我的理解。难怪我没有找到如何完成我的第二种方法的例子。谢谢拉什敏。
  • 我确实看到了这个特定视图的一个问题。当用户编辑他们的个人资料时,他们必须确认他们的密码。 ConfirmPassword 字段不包含在原始模型中。不知何故,我需要将 NewPassword 和 ConfirmPassword 传回 [HttpPost] 操作,以便在更改密码之前可以比较它们。这两个字段当然不在用户模型中。我该如何处理视图发布模型中没有的所需信息的这种情况?
  • @rwkiii 您可以使用 Html.TextBox 来确认密码。不要与 TextboxFor 绑定。提供一些名称属性和位置验证客户端,在发布表单时,您可以在表单 [“确认密码”] 中获取值。比较两者,如果为真,则保存详细信息,否则向用户显示适当的消息。
猜你喜欢
  • 2019-02-27
  • 2017-08-14
  • 2015-10-12
  • 2011-11-03
  • 1970-01-01
  • 1970-01-01
  • 2014-05-20
  • 1970-01-01
相关资源
最近更新 更多