我有一个使用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属性。
但我想知道是否有更好的方法。
由于
答案 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,每个模型字段(属性)都有一个键,属性名称为键。因此,通过为该属性添加模型错误,错误消息将显示在相应的验证错误位置