Это было бы хорошей отправной точкой: Скотт Гу - ASP.NET MVC 2: Проверка модели
Но я бы предположил, что плохая практика привязывать данные к объектам вашего домена.
Мой личный подход заключается в использовании POCO моделей презентаций с атрибутами проверки DataAnnotations для проверки (это упрощает подключение проверки на стороне клиента в дальнейшем). Вы также можете создать свои собственные атрибуты ValidationAttributes, чтобы подключиться к проверке привязки данных.
Если он действителен после привязки данных к вашему объекту POCO, передайте ему услугу, которая выполняет более сложную проверку вашего бизнеса. После того, как проверка прошла успешно, передайте ее другой службе (или той же службе), которая передает значения в ваш объект домена и затем сохраняет ее.
Я не знаком с шаблоном GetRuleViolations Linq to SQL, поэтому не стесняйтесь заменить один из моих шагов тем шаблоном, где он подходит.
Я постараюсь объяснить это здесь.
Модель презентации POCO:
public class EditCustomerForm
{
[DisplayName("First name")]
[Required(ErrorMessage = "First name is required")]
[StringLength(60, ErrorMessage = "First name cannot exceed 60 characters.")]
public string FirstName { get; set; }
[DisplayName("Last name")]
[Required(ErrorMessage = "Last name is required")]
[StringLength(60, ErrorMessage = "Last name cannot exceed 60 characters.")]
public string LastName { get; set; }
[Required(ErrorMessage = "Email is required")]
[RegularExpression(@"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}" +
@"\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\" +
@".)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$",
ErrorMessage = "Email appears to be invalid.")]
public string Email { get; set; }
}
логика контроллера
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(int id, EditCustomerForm editCustomerForm)
{
var editCustomerForm = CustomerService.GetEditCustomerForm(id);
return View(editCustomerForm);
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(int id, EditCustomerForm editCustomerForm)
{
try
{
if (Page.IsValid)
{
//Complex business validation that validation attributes can't handle
//If there is an error, I get this method to throw an exception that has
//the errors in it in the form of a IDictionary<string, string>
CustomerService.ValidateEditCustomerForm(editCustomerForm, id);
//If the above method hasn't thrown an exception, we can save it
//In this method you should map the editCustomerForm back to your Cusomter domain model
CustomerService.SaveCustomer(editCustomerForm, id)
//Now we can redirect
return RedirectToAction("Details", new { id = customer.AccountID });
}
//ServiceLayerException is a custom exception thrown by
//CustomerService.ValidateEditCusotmerForm or possibly .SaveCustomer
catch (ServiceLayerException ex)
{
foreach (var kvp in ex.Errors)
ModelState.AddModelError(kvp.Key, kvp.Value);
}
catch (Exception ex) //General catch
{
ModelState.AddModelError("*", "There was an error trying to save the customer, please try again.");
}
return View(editCustomerForm);
}
Ясно, как грязь? Если вам нужно больше разъяснений, просто дайте мне знать: -)
Опять же, это только мой подход. Возможно, вы могли бы просто следовать статье Скотта Гу, на которую я ссылался, а затем перейти оттуда.
HTHS
Charles