我在ASP.NET MVC 2项目中对EF4的良好设计提出了几个问题。
首先,验证。我应该将表单验证放在我的实体的SavingChanges事件中吗?如何获取分部类中的表单数据?或者有更好的方法吗?
其次,维护登录用户。我来自PHP背景,习惯上在会话中传递用户信息。我应该用User实体对象吗?似乎有点矫枉过正。
答案 0 :(得分:2)
我在ASP.NET MVC 1(.NET 3.5)中编写了一个应用程序,并使用这个“设计模式”来处理我的模型中的验证:
namespace MyProject.Models {
public partial class SomeModel {
public bool IsValid {
get { return (GetRuleViolations().Count() == 0); }
}
public IEnumerable<RuleViolation> GetRuleViolations() {
SomeModelRepository smr = new SomeModelRepository();
if (String.IsNullOrEmpty(Title))
yield return new RuleViolation("Title required", "Title");
if (String.IsNullOrEmpty(Author))
yield return new RuleViolation("Author required", "Author");
// Add more validation here if needed
yield break;
}
partial void OnValidate(System.Data.Linq.ChangeAction action)
{
if (!IsValid)
throw new ApplicationException("Rule violations prevent saving");
}
}
}
这依赖于名为RuleViolation的类:
namespace MyProject.Models
{
public class RuleViolation
{
public string ErrorMessage { get; private set; }
public string PropertyName { get; private set; }
public RuleViolation(string errorMessage)
{
ErrorMessage = errorMessage;
}
public RuleViolation(string errorMessage, string propertyName)
{
ErrorMessage = errorMessage;
PropertyName = propertyName;
}
}
}
在控制器创建/编辑POST功能中,我可以检查模型是否通过以下方式验证:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(SomeModel somemodel)
{
if (ModelState.IsValid)
{
try
{
somemodel.DateCreated = DateTime.Now;
somemodel.DateModified = DateTime.Now;
somemodelRepository.Add(somemodel);
somemodelRepository.Save();
return RedirectToAction("Index");
}
catch
{
foreach (var issue in chapter.GetRuleViolations())
{
// This add the errors to the view so the user knows what went wrong
ModelState.AddModelError(issue.PropertyName, issue.ErrorMessage);
}
}
}
return View(somemodel);
}
然后,您可以在视图中使用以下行来显示所有验证错误:
<%= Html.ValidationSummary() %>
还把它放在这样的字段旁边:
<label for="Title">Title:</label>
<%= Html.TextBox("Title") %>
<%= Html.ValidationMessage("Title", "*") %>
我不能说这是在MVC 2中实现它的最佳方式,但它在MVC 1中对我来说非常有用,并且继续在MVC 2中工作。
就用户会话而言,您可以在ASP.NET MVC中使用它们。我正在使用System.Web.Security.FormsAuthentication和FormsAuthenticationTicket来处理诸如创建会话,保持会话中存储的用户名,会话到期时间和其他一些事情。使用该会话创建会话后,您可以根据需要在会话中存储其他信息。我为每个页面加载所需的数据执行此操作。如果它的内容像会话期间可以更改的论坛帖子一样动态,只需根据需要从数据库中获取。
我确实在项目中找到了这段代码,但它永远存在,因为我记得这一切意味着什么:
FormsAuth.SignIn(userName, rememberMe);
FormsAuthentication.SetAuthCookie(userName, rememberMe);
FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(1, userName, DateTime.Now, DateTime.Now.AddDays(1), rememberMe, Convert.ToString(somePieceOfDataIAlsoWantedSaved));
(我从项目中复制了这个并更改了一些变量名。仔细检查我的语法并检查相关文档也没有坏处:p)