如果我的模型看起来像这样:
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);
}
}
我需要重新填充模型对象的UserNames属性,然后再将其传递给View方法。这是我当然可以做的事情,但确实感觉有点脏。这引出了我的问题。有没有更好的方法来解决这个问题?
答案 0 :(得分:1)
这是我当然可以做的事情,但确实感觉有点脏。
它不脏。这就是MVC的工作原理 - &gt;这是无国籍的。作为替代方案,您可以将用户名列表作为隐藏字段包含在表单中,以便将它们POST回到控制器。但这不是您可以依赖的信息,因为用户可以修改这些值。因此,如果您需要信任这些值,您最好查询后端。
答案 1 :(得分:0)
我已经了解MVC,你应该在模型中有一个方法更新UserNames属性。你的控制器应该做的全部(在这个问题上没有更多)是将必要的参数传递给这个函数。通过这种方式,您的控制器只是将只有它可以知道的信息传递给逻辑应该去的模型。
我不知道任何asp.net所以我遗憾地没有为您提供代码示例。
答案 2 :(得分:0)
基本上这取决于你的观点实际上在做什么。当然,如果您将UserNames集合呈现为隐藏表单字段列表,则模型绑定可以在http post上为您执行此操作。这就是http编程的目的。国家不打算在获取和发布之间留下来。
真的你的选择就是在你提到的时候重建那个列表或渲染一些隐藏的字段(我不建议这样做)并让模型绑定做它的事情。
答案 3 :(得分:0)
通常我有一个特定模型的类(以及密切相关的实体)来处理数据库访问和填充视图模型(尽管你可以添加另一个层,以便数据库访问和映射到视图模型是分开的,也许可以利用映射框架)。无论哪种方式,它都会有一个类似GetLogins的方法,你可以在任何需要这样的列表的地方调用,甚至可能是其他控制器,比如Friends页面需要列出某人可以请求朋友的登录名,这是一个人为的例子,但你得到了这个想法。
由于您的Get和POST方法都需要重新显示页面(如果出现错误,POST),它们都可以调用GetLogins,这样您就不会在两个地方重复使用该数据库访问代码强>