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