#wcf #asp.net-mvc-3 #validation #wcf-client
#wcf #asp.net-mvc-3 #проверка #wcf-клиент
Вопрос:
У меня есть приложение MVC3, которое использует службы WCF для доступа к данным. Службы WCF используют EF4.1 для доступа к данным.
Я хочу минимальных зависимостей между приложением MVC3 и службами WCF, чтобы они не совместно использовали какие-либо библиотеки. Единственной зависимостью в приложении MVC3 является ссылка на службу.
Для проверки объектов при сохранении я определил контракты операций в службах WCF для создания FaultContract, определенного как показано ниже:
[OperationContract]
[FaultContract(typeof(EntityFault))]
void AddAddressEntity(Address entity);
EntityFault определяется следующим образом:
[DataContract(IsReference=true)]
public class EntityFault
{
[DataMember]
public string ErrorMessage { get; set; }
[DataMember]
public virtual ICollection<ValidationErrorMessage> ValidationErrorMessages
{ get; set; }
}
и ValidationErrorMessage — это простой класс с двумя свойствами: propertyName и ValidationMessage
Я перехватываю исключение DbEntityValidationException, как показано ниже:
try
{ //....
db.SaveChanges();
}
catch (DbEntityValidationException ex)
{
EntityFault ef = EntityFaultHelper.CreateValidationFault(ex, entity);
throw new FaultException<EntityFault>(ef, ef.ErrorMessage);
}
В моем приложении MCV3 я перехватываю исключение ошибки. Но как я могу отобразить сообщения об ошибках либо в
@Html.ValidationMessageFor(<my specific field>)
или в
@Html.ValidationSummary(...)
раздел?
Если поля модели были аннотированы или если клиентский объект реализует IValidatableObject, сообщения об ошибках отображаются в указанных областях.
Одна из идей состоит в том, чтобы использовать ViewBag и определить заполнители отображения для сообщений об ошибках, полученных из FaultContract WCF, и установить соответствующие динамические свойства ViewPag для полученных сообщений об ошибках.
Но мне интересно, есть ли лучший подход.
Спасибо
Ответ №1:
Пока я нашел следующее решение
Я добавил для каждого поля в представлении заполнитель для отображения сообщения об ошибке, как показано ниже:
<div class="editor-label">
@Html.LabelFor(model => model.State)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.State)
@ViewBag.StateError
</div>
Затем в контроллере у меня есть этот код
using (var addressClient = new AddressServiceClient(_configName))
{
try
{
addressClient.AddAddressEntity(address);
return RedirectToAction("Index");
}
catch (FaultException<EntityFault> ex)
{
foreach (var err in ex.Detail.ValidationErrorMessages)
{
ViewData.Add(
string.Format("{0}Error", err.PropertyName),
err.ErrorMessage);
}
}
}
И он отображает ошибки прямо рядом с полями.
Но мне все еще интересно, есть ли способ использовать заполнители
@Html.ValidationMessageFor(model => model.Address1)
или
@Html.ValidationSummary(true)
Причина в том, что я не хочу вручную изменять все представления создания / редактирования, созданные MVC3 VS helper, я предпочитаю найти способ повторного использования этих заполнителей.
Редактировать
Я нашел лучшее решение. Он работает непосредственно с представлением, созданным MVC из коробки.
Ключевой код заключается в установке сообщений об ошибках в ModelState, как показано ниже
try
{
addressClient.AddAddressEntity(address);
return RedirectToAction("Index");
}
catch (FaultException<EntityFault> ex)
{
foreach (var err in ex.Detail.ValidationErrorMessages)
this.ModelState.AddModelError(err.PropertyName, err.ErrorMessage);
}
Дело в том, что в ModelState для каждого поля модели (свойства) есть ключ с именем свойства в качестве ключа. Таким образом, при добавлении ошибки модели для этого свойства сообщение об ошибке отображается в соответствующем месте для ошибки проверки