如何在MVC3应用程序中显示从WCF服务收到的验证异常

时间:2011-10-29 00:17:12

标签: wcf asp.net-mvc-3 validation wcf-client

我有一个使用WCF服务进行数据访问的MVC3应用程序。 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,并为从WCF的FaultContract接收的错误消息定义显示占位符,并为接收到的错误消息设置相应的ViewPag dinamic属性。

但我想知道是否有更好的方法。

由于

1 个答案:

答案 0 :(得分:0)

到目前为止,我找到了以下解决方案

我为视图中的每个字段添加了占位符,以显示错误消息,如下所示:

    <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帮助程序生成的所有创建/编辑视图,我更愿意找到重用这些占位符的方法。

修改

我找到了更好的解决方案。它直接与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,每个模型字段(属性)都有一个键,属性名称为键。因此,通过为该属性添加模型错误,错误消息将显示在相应的验证错误位置