设计问题:EF4和ASP.NET MVC 2

时间:2010-10-15 19:20:44

标签: asp.net-mvc-2 entity-framework-4

我在ASP.NET MVC 2项目中对EF4的良好设计提出了几个问题。

首先,验证。我应该将表单验证放在我的实体的SavingChanges事件中吗?如何获取分部类中的表单数据?或者有更好的方法吗?

其次,维护登录用户。我来自PHP背景,习惯上在会话中传递用户信息。我应该用User实体对象吗?似乎有点矫枉过正。

1 个答案:

答案 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)