MVC结构查询

时间:2015-08-13 17:35:54

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

总之,我正在追逐我的尾巴试图让一个简单的ASP.NET MVC的结构正确。从一开始我应该说我是ASP和MVC的新手,我以前用了一点C#。

例如,让我说我正在尝试检查两条信息,例如用户输入的用户名和密码,用于存储所有用户信息的数据库。如果他们输入了正确的凭据,则会显示用户信息的摘要,如果没有,则会在登录页面上显示(请在视觉上永远不会离开),请再试一次。

所以我有我的主页(登录页面)视图,HomeControllerHomeIndexViewModel。同样,我有一个帐户视图,AccountControllerAccountUserViewModel(还有AccountIndexViewModel,但实际上并未使用过。)

主页视图'(通过它的控制器)接收HomeIndexVM作为模型:

@model ViewModels.HomeIndexViewModel

@using (Html.BeginForm("User", "Account", FormMethod.Post))
{
    if (@Model.PreviousAttempts)
    { 
        <p><b>Username or password were not recognised please try again.</b></p>
    }

    <p>Username: @Html.TextBoxFor(x => x.Username)</p>
    <p>Password: @Html.PasswordFor(x => x.Password)</p>
    <input id="btnLogin" type="submit" value="Login" />
}

HomeController中:

public class HomeController : Controller
{
    public ActionResult Index(bool invalidLogin = false)
    {
        var vm = new HomeIndexViewModel() { Username = string.Empty, Password = string.Empty, PreviousAttempt = invalidLogin };

        return View(vm);
    }
}

最后是HomeIndexViewModel.cs

public class HomeIndexViewModel
{        
    public string Username { get; set; }
    public string Password { get; set; }
    public bool PreviousAttempt { get; set; }
}

我认为到目前为止还可以。现在点击登录按钮,它将发布到帐户,用户。

public ActionResult User(UserLogin userLogin)
{
    if (!ModelState.IsValid)
        return RedirectToAction("Index", "Home", new { invalidLogin = true });

    // Match username and password against database
    User user = userLogin.IsValid(userLogin.Username, userLogin.Password);
    if (user != null)
    {
         return this.View(user);
    }

    return RedirectToAction("Index", "Home", new { invalidLogin = true });
}

这里有几件事情,您可以看到重定向回到登录页面,并带有true标志以显示失败的登录消息。

但更重要的是,显然它不会起作用,因为它需要UserLogin作为参数。这是一个包含以下内容的模型对象:

public class UserLogin
{
    private NewDBSolution_v1Entities accountsDB = new NewDBSolution_v1Entities();

    [Required, MinLength(2)]
    public string Username { get; set; }

    [DataType(DataType.Password), Required]
    public string Password { get; set; }

    public bool PreviousAttempts { get; set; }

    public User IsValid(string username, string password) // Ideally use the local username and password properties rather than pass in as they are the same.
    {            
        // Match username and password against database and return full user info if match found, otherwise return null
    }
}

那么我要问的是......在这种情况下,最好的做法是使用帐户的用户操作来获取HomeIndexViewModel,即使它是主页而不是帐户相关的?或者我应该像我原先做的那样传入一个模型对象,并将其用于验证(我不喜欢这个是验证是在对象中完成的,如果有意义的话,从另一个视图传递?)< / p>

如何最好地从视图中捆绑信息以传递给Action?我意识到VMs和Model对象,编译器并不关心它们只是类,但我想让我的关注点分离正确。

基本上我需要的是Home视图中的用户名和密码,是否应捆绑到VM或M?

在我看来,有可能会有很多类略有不同,所以为什么不制作一个并使用它。我想这就是继承的来源,但如果子类只添加一个不同的属性,你会在那里获得很多吗?

无论如何,我一直在圈子里谈论最好的结构方式。我确实在某处读过VM应该基本上是模型上的掩码/适配器,以便视图只能看到它需要的东西。但是这些虚拟机没有与之关联的模型。

我现在在漫无边际,如果有人可以做出这个或者尾巴,给我一些指示,我将非常感激,谢谢。

0 个答案:

没有答案