总之,我正在追逐我的尾巴试图让一个简单的ASP.NET MVC的结构正确。从一开始我应该说我是ASP和MVC的新手,我以前用了一点C#。
例如,让我说我正在尝试检查两条信息,例如用户输入的用户名和密码,用于存储所有用户信息的数据库。如果他们输入了正确的凭据,则会显示用户信息的摘要,如果没有,则会在登录页面上显示(请在视觉上永远不会离开),请再试一次。
所以我有我的主页(登录页面)视图,HomeController
和HomeIndexViewModel
。同样,我有一个帐户视图,AccountController
和AccountUserViewModel
(还有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应该基本上是模型上的掩码/适配器,以便视图只能看到它需要的东西。但是这些虚拟机没有与之关联的模型。
我现在在漫无边际,如果有人可以做出这个或者尾巴,给我一些指示,我将非常感激,谢谢。