2011-10-29 3 views
0

データアクセスにWCFサービスを使用するMVC3アプリケーションがあります。 WCFサービスは、EF4.1をデータアクセスに使用します。MVC3アプリケーションでWCFサービスから受信した検証例外を表示する方法

MVC3アプリケーションとWCFサービスの間の依存関係を最小限にしたいので、ライブラリを共有しません。 MVC3アプリの唯一の依存関係はサービス参照です。

[OperationContract] 
[FaultContract(typeof(EntityFault))] 
void AddAddressEntity(Address entity); 

EntityFaultは、以下のように定義されています:

は、私は以下のように定義FaultContractを生成するために、WCFサービスに操作コントラクトを定義し、保存上のエンティティを検証するために

[DataContract(IsReference=true)] 
public class EntityFault 
{ 
    [DataMember] 
    public string ErrorMessage { get; set; } 
    [DataMember] 
    public virtual ICollection<ValidationErrorMessage> ValidationErrorMessages 
     { get; set; } 
} 

とValidationErrorMessageは簡単ですPropertyNameとValidationMessageの2つのプロパティを持つクラス

私は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を実装している場合は、指定された領域にエラーmsgが表示されます。

ViewBagを使用し、WCFのFaultContractから受信したエラーmsgの表示プレースホルダを定義し、受信したエラーmsgに対応するViewPagダイナミックプロパティを設定することを考えてください。

しかし、もっと良いアプローチがあるのだろうかと思います。私はコントローラに続い

<div class="editor-label"> 
     @Html.LabelFor(model => model.State) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.State)    
     @ViewBag.StateError     
    </div> 

おかげ

答えて

0

は、これまでのところ私は

私は以下のようにエラーメッセージを表示するビュー内の各フィールドのプレースホルダを追加し、以下の解決策を見つけこのコード

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のエラーメッセージを設定することです。そのプロパティのモデルエラーを追加することにより、エラーメッセージが対応する場所に表示され、検証エラー

関連する問題