2013-02-18 34 views
0

如果我有一个模型,它看起来是这样的:MVC模型的设计和使用

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方法。这是我当然可以做的事,但它确实感觉有点。这让我想到了这个问题。有没有更好的方法来处理这个问题?

+2

你现在在MVC--想*无国界* – Nick 2013-02-18 22:32:12

+0

感谢所有的答案。每个回答似乎基本上表明相同的事情。有趣的是,如果我使用传统的ASP.NET(阅读,我从来没有真正喜欢会话和视图状态),我不会考虑*重建*模型,所以我不知道为什么我会被抓到在这种情况下。我想我只是想确保我正在做正确的事情(或者至少以一种可以接受的方式),因为我刚刚开始。 – 2013-02-19 14:11:36

回答

1

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

它不脏。这就是MVC的工作原理 - >它是无状态的。作为替代,您可以将用户名列表作为隐藏字段添加到表单中,以便将其邮寄回控制器。但这不是您可以依赖的信息,因为用户可以修改这些值。所以如果你需要相信这些值,你最好为你的后端查询它们。

0

正如我已经了解MVC是你应该有一个方法在模型更新UserNames属性。控制器应该做的所有事情(没有其他更多)是将必要的参数传递给这个函数。那样,你的控制器只是将它只能知道的信息传递给逻辑应该去的模型。

我不知道任何asp.net,所以我可以悲伤地不给你提供一个代码示例。

0

基本上这取决于您的视图实际上在做什么。当然,如果您将UserNames集合呈现为隐藏表单字段的列表,则模型绑定可以在http post上为您执行此操作。这就是说,这是http编程的工作原理。国家不打算继续之间获取和帖子。

真的,你的选择是重新建立你的列表或渲染出一些隐藏的领域(我不会建议),并让模型绑定做它的事情。

0

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

由于您的Get和POST方法都需要重新显示页面(如果发生错误,POST),它们都可以调用GetLogins,这样就不会在两处重复该DB访问代码。