Как отобразить исключения проверки, полученные от службы WCF, в приложении MVC3

#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 для каждого поля модели (свойства) есть ключ с именем свойства в качестве ключа. Таким образом, при добавлении ошибки модели для этого свойства сообщение об ошибке отображается в соответствующем месте для ошибки проверки