0

如果我有一个看起来像这样的模型:

public class LoginModel
{
  pulbic List<string> UserNames {get; set; }
  public string SelectedUserName {get; set; }
  public string Password {get; set; }
}

而且我还有一个控制器,其中包含几个如下所示的操作方法:

public ActionResult Login()
{
  LoginModel model = null;

  model = new LoginModel();

  // Code to populate the UserNames property of the LoginModel instance (model)...

  return View(model);
}

[HttpPost()]

public ActionResult Login(LoginModel model)
{
  if (ModelState.IsValid == true)
  {
    return RedirectToAction("SomeOtherAction")
  }
  else
  {
    return View(model);
  }
}

在将模型对象传递给 View 方法之前,我需要重新填充模型对象的 UserNames 属性。这是我当然可以做的事情,但确实感觉有点。这让我想到了这个问题。有没有更好的方法来处理这个?

4

4 回答 4

1

这是我当然可以做的事情,但确实感觉有点脏。

它不脏。这就是 MVC 的工作方式 -> 它是无状态的。作为替代方案,您可以将用户名列表作为隐藏字段包含在表单中,以便将它们发布回控制器。但这不是您可以依赖的信息,因为用户可以修改这些值。因此,如果您需要信任这些值,最好在后端查询它们。

于 2013-02-18T22:32:33.270 回答
0

据我了解,MVC 是您应该在模型中有一个方法更新 UserNames 属性。您的控制器应该做的所有(仅此而已)就是将必要的参数传递给该函数。这样,您的控制器只是将只有它可以知道的信息传递给逻辑应该去的模型。

我不知道任何 asp.net,所以很遗憾我不能为您提供代码示例。

于 2013-02-18T22:36:51.390 回答
0

本质上,这取决于您的视图实际上在做什么。当然,如果您将 UserNames 集合呈现为隐藏表单字段的列表,模型绑定可以在 http 发布时为您执行此操作。也就是说,这就是 http 编程的工作方式。状态并不打算停留在获取和发布之间。

实际上,您的选择是按照您提到的那样重建该列表或渲染一些隐藏字段(我不建议这样做)并让模型绑定完成它的工作。

于 2013-02-18T22:38:34.890 回答
0

通常我有一个用于处理数据库访问和填充视图模型的特定模型(和密切相关的实体)的类(尽管您甚至可以添加另一层,以便数据库访问和映射到视图模型是分开的,也许利用映射框架) . 无论哪种方式,它都会有一个像 GetLogins 这样的方法,你可以在任何需要这样列表的地方调用它,甚至可能像 Friends 页面这样需要列出某人可以请求朋友的登录名的其他控制器,这是一个人为的例子,但你明白了.

由于您的 Get 和 POST 方法都需要重新显示页面(出现错误时为 POST),因此它们都可以调用 GetLogins,这样您就不会在两个地方重复该数据库访问代码。

于 2013-02-18T22:38:55.493 回答