1

マスター ページ site.master にある LogOn.ascx コントロールがあります。

<% Html.RenderPartial("LogOn"); %>

このコントロールには、LoginController に送信されるメールとパスワードがテキストボックス化されたフォームが含まれています。

public class LoginController : Controller
{
     ...
    [HttpPost]
    public ActionResult Login(string email, string password)
    {
        if (this.userRepository.ExistByEmail(email) &&
            this.authenticationService.IsPasswordMatches(email, password))
        {
            var user = this.userRepository.GetByEmail(email);
            this.userSession.LogIn(user);
            return PartialView("LogOn", user);
        }
        return PartialView("LogOn");
    }
}

したがって、ユーザーが正常に認証された場合、ユーザーを LogOn 部分ビュー (簡略化) のモデルに渡します。

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Core.Model.User>" %>
<%= this.Model.FirstName %>

このコードには 2 つの問題があります。

  1. 呼び出した後return PartialView("LogOn")、「IControllerFactory 'UI.Services.ControllerFactory' は名前 'default.aspx' のコントローラーを返しませんでした」という例外が発生します。この問題は、「default.aspx」のルーティングを追加することで解決されます。しかし、なぜ私が呼び出すときに要求が "default.aspx" に行くのreturn PartialView(..)ですか? (私はVS Webサーバーを使用しています)

  2. ユーザーが正常に認証され、null 以外の値が次の行の PartialView に渡された場合でも、LogOn.ascx 内で null 参照例外が発生します。

ユーザーが LogOn.ascx に渡されない理由を知っている人はいますか? ありがとう

4

1 に答える 1

0

あなたのログイン フォームは、AJAX の投稿ではなく、標準のサーバーへの送信 (つまり、ページ全体の送信) を行っていると思いますか?

その場合、ログイン アクションからのアクションの結果は、部分ビューではなく全体ビューである必要があります。部分ビューをホストするページはありません。

これに続いて Default のルートを追加したので、ページから呼び出したときに User オブジェクトをパーシャルに実際に渡しているわけではありません。

<% Html.RenderPartial("LogOn"); %>

ユーザーでこれを呼び出す必要があります。つまり、メンバーシップ プロバイダーを使用していない場合は、返す ViewData またはモデルにユーザーを追加する必要があります。

LogOn パーシャルでいくつかのチェックを行って、 User オブジェクトが渡されたかどうかを確認する以外に、リクエストが認証されているかどうかを確認していると思います-このパーシャルへの呼び出しのほとんどは、そうでないマスターページからのものになるためですUser オブジェクトを渡さないと、ほとんどの場合失敗します。

于 2009-12-17T11:49:16.560 に答える