У меня есть сборка, созданная с использованием шаблона POCO с использованием Entity Framework (например, «Company.Models.dll»). Помимо сгенерированных POCO, у меня также есть «отслеживание» частичных классов, которые определяют метаданные с использованием System.ComponentModel.DataAnnotations.Так, например, Company.Models.Customer генерируется автоматически (в отдельной папке), а затем у меня есть частичный класс с тем же пространством имен.В этом частичном классе я определяю внутренний класс для метаданных ... Например:
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
namespace Company.Models
{
[MetadataType(typeof (CustomerMetaData))]
public partial class Customer
{
public override string ToString()
{
return String.Format("Id: {0}, Name: {1}", Id, Name);
}
//[Bind(Exclude = "Id")]
public class CustomerMetaData
{
[ScaffoldColumn(false)]
public int Id { get; set; }
[DisplayName("Name")]
[Required(ErrorMessage = "Customer Name is required.")]
[StringLength(100, ErrorMessage = "Customer name cannot exceed 100 characters.", MinimumLength = 2)]
public string Name { get; set; }
}
}
}
Проблема, с которой я столкнулся, заключается в том, что теперь я хочу использовать эту сборку в своем проекте MVC и хочу использовать специфичные для MVC атрибуты.(как закомментированный атрибут Bind выше). Однако для этого требуется сделать мою Company.Models.dll зависимой от System.Web.Mvc.dll.
Я хотел бы избежать этого любой ценой, если это возможно, нокак?
До сих пор я знаю о 2 возможных решениях и прошу сообщество высказать свое мнение или более эффективные подходы ...
Решение 1
Это решение обсуждалось здесь: Использование аннотаций данных в POCO с MVC для удаленной проверки «Хитрость» заключалась в том, чтобы использовать ViewModels и отображать (вручную или с помощью AutoMapper) POCO для MVC-проекта конкретных ViewModels.Затем примените все необходимые атрибуты к ViewModels вместо POCO модели домена.Хотя это имеет смысл для больших проектов, для небольших простых решений это немного излишне ...
Solution 2
Использовать атрибут Bind в параметрах действия контроллера (как видно на некоторых http://www.asp.net/mvc учебники).Например:
//
// POST: /Customer/Create
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create([Bind(Exclude="Id")]Customer customerToCreate)
{
if (!ModelState.IsValid)
return View();
// TODO: Add insert logic here
return RedirectToAction("Index");
}
Использование этого решения позволит пропустить зависимость от System.Web.Mvc из моей библиотеки POCO за счет необходимости не забывать вставлять атрибут Bind во все соответствующие действия контроллера.Кроме того, если у меня несколько проектов ASP.NET MVC, проблема усугубляется ...
Итак, есть ли другой путь?;)