2017-06-01 7 views
-1

私はWeb APIを呼び出すMVC Web Appを開発中です。私の作成(POST)メソッドでは、ユーザーはデータベース内の一部のユーザーの電子メールアドレスを入力します。電子メールがまだデータベースに存在しない場合にのみ、電子メールを入力するためのチェックがあります。既に存在する場合は、ユーザーに「電子メールが既に存在します」というエラーメッセージを表示する必要があります。エラーメッセージをユーザーに表示するWebClientレスポンスを処理するにはどうすればよいですか?

承認されたユーザーの作成に失敗したときにユーザーにエラーメッセージを表示するためのレスポンスの処理方法がわかりません。私はtry-catchケースで試していますが、動作しません。私はViewBag.Message = errorを持っています。それは失敗したときにインデックスビューに表示しようとしています。しかし、何も表示されていません。私がデバッグすると、電子メールがデータベースに存在するときにもcatchには行きません。インデックスビューに移動するだけです。

public ActionResult Create([Bind(Include = "Email,FirstName,LastName")] ApprovedUsers approvedUsers) 
{ 
    try 
    { 
     using (WebClient client = new WebClient()) 
     { 
      token = Session.GetDataFromSession<string>("access_token"); 
      client.Headers.Add("authorization", "Bearer " + token); 
      byte[] response = client.UploadValues(apiUrl, "POST", new NameValueCollection() 
      { 
       { "Email", approvedUsers.Email }, 
       { "FirstName",approvedUsers.FirstName }, 
       { "LastName",approvedUsers.LastName } 
      }); 

      string result = System.Text.Encoding.UTF8.GetString(response); 
      return RedirectToAction("Index"); 
     } 
    } 
    catch 
    { 
     return RedirectToAction("Index", new { error = "Email exists" }); 
    } 
} 

インデックスアクション

public ViewResult Index(string sortOrder, string currentFilter, string searchString, int? page, string error) 
     { 
      ViewBag.Message = error; 

は、これが呼び出されているAPI方法です。

public IHttpActionResult PostApprovedUsers(ApprovedUsers approvedUsers) 
{ 
    if (!ModelState.IsValid) 
    { 
     return BadRequest(ModelState); 
    } 

if (!db.ApprovedUsers.Any(u => u.Email == approvedUsers.Email)) 
{ 
    db.ApprovedUsers.Add(approvedUsers); 
    db.SaveChanges(); 
} 
return CreatedAtRoute("DefaultApi", new { id = approvedUsers.Email }, approvedUsers); 
+0

インデックスの動作はどのように見えますか? –

+0

私は自分の投稿のIndex ViewResultからコードの一部を追加しました。それはあなたが求めていたものですか? – StraightUp

+0

インデックスへのエントリにブレークポイントを設定します。あなたが渡そうとしているコンテンツを探します。オブジェクトを取得していないメソッドにオブジェクトを渡そうとしています。代わりに、以下のものが必要です:string sortOrder、string currentFilter、string searchString、int?ページ、文字列エラー。たとえば、エラー文字列パラメータがある場合は、それを渡すことができます。しかし、一般的に、その多くのパラメータを使用すると、モデルを作成してinstedに渡す方が良いでしょう。 –

答えて

0

は、それが問題を引き起こしていた私のAPIました。重複した電子メールの作成に失敗した場合でも、電子メールがデータベースに存在していれば、悪い要求が返ってこなかったので、catchには行かなかった。

これに私のAPIを変更して、それが動作していました。

if (db.ApprovedUsers.Any(u => u.Email == approvedUsers.Email)) 
{ 
    return Content(HttpStatusCode.BadRequest, "Email exists already"); 
} 
else 
{ 
    db.ApprovedUsers.Add(approvedUsers); 
} 
    try 
    { 
     db.SaveChanges(); 
    } 
    catch (DbUpdateException e) 
    { 
     if (ApprovedUsersExists(approvedUsers.Id)) 
     { 
      return Conflict(); 
     } 
     throw e; 
0

これを試してみてください:

public ActionResult Create([Bind(Include = "Email,FirstName,LastName")] ApprovedUsers approvedUsers) 
{ 
    try 
    { 
     using (WebClient client = new WebClient()) 
     { 
      token = Session.GetDataFromSession<string>("access_token"); 
      client.Headers.Add("authorization", "Bearer " + token); 
      byte[] response = client.UploadValues(apiUrl, "POST", new NameValueCollection() 
      { 
       { "Email", approvedUsers.Email }, 
       { "FirstName",approvedUsers.FirstName }, 
       { "LastName",approvedUsers.LastName } 
      }); 

      string result = System.Text.Encoding.UTF8.GetString(response);    
     } 
    } 
    catch 
    { 
     TempData["Error"] = "Email Exists";}); 
    } 

    RedirectToAction("Index"); 

} 

public ViewResult Index(string sortOrder, string currentFilter, string searchString, int? page, string error) 
    { 
     ViewBag.Message = TempData["Error"].ToString(); 
    } 
+0

いいえ、エラーメッセージは表示されません。 – StraightUp

+0

私はViewBagを使用したことはありませんでした。エラー情報を含むStrongly Typeモデルです。ビューバッグを使いたい場合は、例を修正しました –

関連する問題