Проверка на стороне сервера в ASP.NET MVC 3 с Entity Framework
-
26-10-2019 - |
Вопрос
Я использую ASP.NET MVC3 с Enitity FrameWord. Оба общаются через веб -сервис WCF.
Проблема заключается в том, что на серверной стороне разработчиков DB не хотят устанавливать атрибуты [требуется]/[диапазон] в свойство в классах объектов. Но я хочу проверить поле на моем конце в приложении MVC3. где, как я добавил ссылку на веб -сервис WCF. который сгенерировал прокси.
Я не хочу использовать jquery/javascript в соответствии с политикой клиента. Поэтому мне нужно сделать это на уровне контроллера/модели. Как справиться с этим? Некоторое время, как мне нужно добавить необходимый атрибут к свойствам каждого объекта динамически из MVC 3 AAPLICATION. Нужна правильное направление, чтобы ускорить.
Забыл добавить: разработчик DB строго избегает пользователя. Также БД не генерируется в сущности и отображениях.
Решение
Вы должны Напишите код, чтобы проверить свои объекты. Анкет Даже если бы разработчики использовали эти атрибуты на сущностях, у вас их не будет на вашей стороне, потому что вы получаете доступ к DAL через прокси -сервер WCF, и эти атрибуты не генерируются инструментом на вашей стороне.
Все классы, сгенерированные с помощью ссылки на добавление услуг, должны быть частичными, поэтому вы можете добавить свою пользовательскую частичную часть и реализовать проверку (реализация IValidatableObject
интерфейс).
Другие советы
Я согласен с Ladislav Mrnka, но если вы не можете изменить свойства класса сущности, вы должны его найти:
[MetadataType(typeof(YourOwnClassForValidation))]
public partial class ClassOfYourDbDeveloper
{
// db developer doesn't allow you to change this
public string Title { get; set; }
}
public class YourOwnClassForValidation
{
// here you can use your data annotations
// important to use object
[Required]
public object Title { get; set; }
}
Это просто для установления свойств, подробнее об этом здесь, внизу: http://www.asp.net/mvc/tutorials/validation-with-the-data-annotation-validators-cs
Вы можете зарегистрировать класс, который будет использоваться в качестве поставщика метаданных/проверки для ваших моделей.
Наличие вашей сущности, это нельзя изменить:
public class MyModel
{
public int IntProperty { get; set; }
public DateTime DateProperty { get; set; }
}
Вы можете иметь его метаданные на стороне MVC, которые вы можете проверить и предоставить метаданные, как если бы это был оригинальный класс:
[ValidationAttribute(...)]
[ValidationAttribute(...)]
public class MyModelValidator
{
[Required]
[Display("My Integer")]
public int IntProperty { get; set; }
[DataType(DataType.DateTime)]
public DateTime DateProperty { get; set; }
}
Наконец, вам просто нужно прикрепить класс метаданных/валидатора к классу корреспондента, например, на Global.asax:
protected void Application_Start()
{
AssociatedMetadataTypeTypeDescriptionProvider typeDescriptionProvider;
typeDescriptionProvider = new AssociatedMetadataTypeTypeDescriptionProvider(
typeof(MyModel),
typeof(MyModelValidator));
TypeDescriptor.AddProviderTransparent(typeDescriptionProvider, typeof(MyModel));
// register other metadata classes
}
Вы можете сделать это для каждой сущности, которую вы хотите.
Используйте модели просмотра. Одна из их предполагаемых целей - абстрагировать модель (как M в MVC) объекты из взглядов.
Поместите атрибуты проверки в модели вашего представления и используйте Mapper (например, Automapper) для копирования информации в/из сущностей БД.
Использовать ModelState.IsValid
В действиях вашего контроллера, чтобы проверить, действительны ли модели представления.
Мои методы действия, как правило, смотрят на это:
[HttpPost]
public virtual ActionResult Edit(EditModel model)
{
if (!ModelState.IsValid)
return View(model);
try
{
// fetch db entity
var template = _templateService.Get(model.Id);
// copy info from view model to db entity
Mapper.Map(model, template);
// save db entity
templateService.Save(template);
return RedirectToAction("Details", new { id = template.Id });
}
catch (Exception err)
{
Logger.Error("Failed to save template", err);
ModelState.AddModelError("", err);
return View(model);
}
}