Вопросы о дизайне: EF4 и ASP.NET MVC 2 - PullRequest
1 голос
/ 15 октября 2010

У меня есть пара вопросов о хорошем дизайне с EF4 в проекте ASP.NET MVC 2.

Во-первых, проверка.Должен ли я поместить проверку формы в события SavingChanges моих организаций?Как мне получить данные формы в частичном классе?Или есть лучший способ сделать это?

Во-вторых, поддерживая зарегистрированных пользователей.Я пришел из PHP фона, где принято передавать информацию о пользователях в сессиях.Должен ли я сделать это с объектом сущности пользователя?Похоже, излишним за это.

1 Ответ

2 голосов
/ 15 октября 2010

Я написал приложение в 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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...