Как отобразить исключения проверки, полученные от службы WCF в приложении MVC3 - PullRequest
0 голосов
/ 29 октября 2011

У меня есть приложение 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 Ответ

0 голосов
/ 29 октября 2011

Пока я нашел следующее решение

Я добавил для каждого поля в представлении заполнитель для отображения сообщения об ошибке, как показано ниже:

    <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)

Причина в том, что я не хочу вручную изменять все представления Create / Edit, генерируемые помощником MVC3 VS, я предпочитаю найти способ повторно использовать эти заполнители.

Редактировать

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

...