2017-03-09 10 views
0

こんにちはASP.net MVC Webサイトで働いているうちに、私は奇妙な問題に遭遇しました。 私はこのビュー名にGETアクションパラメータ値を使用するASP.NET MVCはなぜですか?

// 
    // POST: /Account/Register 
    [HttpPost] 
    [AllowAnonymous] 
    [ValidateAntiForgeryToken] 
    public async Task<ActionResult> Register(RegisterViewModel model) 
    { 
     if (ModelState.IsValid) 
     { 
      var user = new ApplicationUser { UserName = model.UserName, Email = model.Email }; 
      var result = await UserManager.CreateAsync(user, model.Password); 
      if (result.Succeeded) 
      { 
       //await SignInManager.SignInAsync(user, isPersistent:false, rememberBrowser:false); 
       return RedirectToAction("ConfirmEmailAwait", "Account", new { userId = user.Id }); //<-----[LOOK HERE] 
      } 
      AddErrors(result); 
     } 

     // If we got this far, something failed, redisplay form 
     return View(model); 
    } 

    // 
    // GET: /Account/ConfirmEmailAwait?userId=d178b665-b616-4303-ae7d-00a663014109 
    [AllowAnonymous] 
    public async Task<ActionResult> ConfirmEmailAwait(string userId) 
    { 
     // For more information on how to enable account confirmation and password reset please visit http://go.microsoft.com/fwlink/?LinkID=320771 
     // Send an email with this link 
     string code = await UserManager.GenerateEmailConfirmationTokenAsync(userId); 
     var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = userId, code = code }, protocol: Request.Url.Scheme); 

     string emailHeader = "Confirm your account"; 
     string emailBody = "Please confirm your account by clicking <a href=\"" + callbackUrl + "\">here</a>"; 

     await UserManager.SendEmailAsync(userId, emailHeader, emailBody); 

     return View(userId); 
    } 

のように私の知る限り、このコードは、行うことになっているものありません見ることができるように、それがユーザーに送信しなかった私が得る値を追加したいコントローラ内の別のアクションにリダイレクトしますが正しいURLなので、うまくいくはずです。しかし、あなたはここで、この画像を見れば:

Error image

構築URL:http://localhost:55767/Account/ConfirmEmailAwait?userId=d178b665-b616-4303-ae7d-00a663014109

エラーメッセージ:ビュー 'd178b665-b616-4303-ae7d-00a663014109' またはそのマスターが見つかりませんでしたか表示された場所をサポートするビューエンジンはありません。

検索するビューは、私が非常に奇妙なものを与えた取得値です。

何が起こっているのか分かりませんか?私は愚かな間違いをしていて、それを見ていないのですか?私を助けて、事前に感謝してください。

+0

あなたはビューにリダイレクトしません。アクションにリダイレクトします。 – mason

+0

答えが追加できるように、両方のコントローラメソッドのコードを表示する必要があります(画像へのリンクではありません) –

+0

@masonああ、ありがとう、私は今修正しました – TheRWS96

答えて

1

return View()の最初のパラメータとしてstringを渡します。this overloadのパラメータは、ビューの名前です。パラメータがモデルの場合、this overloadを使用してobjectとして渡す必要があります。

return View((object)userId); 
1

あなたがView(Object model)をしたいときは、View(String viewName)オーバーロードを使用しています。

あなたが最初Objectにキャストするか必要ViewModelとしてString値を使用するには...:

return this.View((Object)userId); 

...またはパラメータラベルを使用します。

パラメータを使用して
return this.View(model: userId); 

ラベルは私の好みのアプローチです。なぜなら、将来のコード読者にとっては、Objectへのキャッシングの理由がすぐには分かりませんが、コメントを追加して、明示的に名前が付けられた理由と、例えば:上記のコードで

return this.View(model: userId); // Be careful not to call the `View(String viewName)` overload! 
0
// GET: /Account/ConfirmEmail 
[AllowAnonymous] 
public async Task<ActionResult> ConfirmEmailAwait(string userId) 
{ 
    // For more information on how to enable account confirmation and password reset please visit http://go.microsoft.com/fwlink/?LinkID=320771 
    // Send an email with this link 
    string code = await UserManager.GenerateEmailConfirmationTokenAsync(userId); 
    var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = userId, code = code }, protocol: Request.Url.Scheme); 

    string emailHeader = "Confirm your account"; 
    string emailBody = "Please confirm your account by clicking <a href=\"" + callbackUrl + "\">here</a>"; 

    await UserManager.SendEmailAsync(userId, emailHeader, emailBody); 

    return View(userId); 
} 

、通知は "ビュー(USERIDは)を返します;"

"userId"は文字列です - View(文字列)を返すとき、ActionはuserIdが実際にView(.cshtmlファイル)のパスであると考えます。

そのため、コードでは、提供されたパスに一致するビューを見つけることができないという例外が発生します。

関連する問題