0

まず、私は MVC を初めて使用します。私は Web フォームの担当者でした...

ページにログイン コントロールを表示したいのですhome/indexが、何をしてもエラーが発生します。さまざまな手法を試しましたが、各手法で多くのエラーが発生したため、ここにすべてをリストすることはしません.

現在Request.IsAuthenticated、ユーザー名を表示する場合はログインフォームを表示するように設定しています。しかし、フォームは明らかにホームコントローラーを見ており、ログインを送信しても何も起こりません。

アドバイスをいただければ幸いです。私はこれに何日も手を出しています。

ありがとう :)

コードは次のとおりです。

'@{
ViewBag.Title = "MyApp";
}

<p>Code for main Index Page here</p>


@model Application.Models.LoginModel
@{
ViewBag.Title = "Log in";
}

@if (Request.IsAuthenticated) {
<text>
    Hello, @Html.ActionLink(User.Identity.Name, "Manage", "Account", routeValues:     null, htmlAttributes: new { @class = "username", title = "Manage" })!
    @using (Html.BeginForm("LogOff", "Account", FormMethod.Post, new { id = "logoutForm" })) {
        @Html.AntiForgeryToken()
        <a href="javascript:document.getElementById('logoutForm').submit()">Log off</a>
    }
</text>
} else {


<section id="loginForm">
<h2>Use a local account to log in.</h2>
@using (Html.BeginForm(new { ReturnUrl = "RedirectToAction" }))
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)

<fieldset>
    <legend>Log in Form</legend>
    <ol>
        <li>
            @Html.LabelFor(m => m.UserName)
            @Html.TextBoxFor(m => m.UserName)
            @Html.ValidationMessageFor(m => m.UserName)
        </li>
        <li>
            @Html.LabelFor(m => m.Password)
            @Html.PasswordFor(m => m.Password)
            @Html.ValidationMessageFor(m => m.Password)
        </li>
        <li>
            @Html.CheckBoxFor(m => m.RememberMe)
            @Html.LabelFor(m => m.RememberMe, new { @class = "checkbox" })
        </li>
    </ol>
    <input type="submit" value="Log in" />
</fieldset>
<p>
    @Html.ActionLink("Register", "Register", "Account") if you don't have an account.
</p> 
}
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
</section>
}

'

4

3 に答える 3

2

次のようにフォームを変更する必要があります。

@using (Html.BeginForm("Login","Account",FormMethod.Post, new { ReturnUrl = ViewBag.ReturnUrl }))

キーは "Login","Account" 部分で、ホーム コントローラーではなくアカウント コントローラーのログイン アクションにデータをポストするようにフォームに指示します。私は同じことで数時間戦った後、それを理解しました.

データがアカウント コントローラー (ユーザー名とパスワードを実際に検証し、ユーザーをログインさせるコントローラー) に送信されない場合、アカウントは決してログインを試みません。

理由は次のとおりです。デフォルトでは、routeconfig.cs クラスはアクションを指定しないリンクまたはフォームを送信し、コントローラーはすべてのものを Home コントローラーの Index アクションに送信します。

お役に立てれば

于 2013-09-16T07:04:28.130 に答える
0

ここでの問題は、コードが何をするのかを実際に理解せずにコードを書こうとしているということです。それが何をするのかを理解していなければ、機能するものを見つけようとしてランダムに変更するだけです。これは、ソフトウェアを書く上で非常に貧弱な方法です。

あなたの問題は、MVC が単に H​​TML を生成していることを理解していないという事実に根ざしており、その HTML が何をしているのかを理解していなければ、これをランダムに理解する見込みはほとんどありません。

まず、MVC には「ログイン コントロール」の概念がありません。これらは単なる HTML フォーム フィールドであり、HTML フォーム要素内にあります。これらのフォーム フィールドは、標準の HTML を使用してコントローラーにポストされます。つまり、フォーム アクション メソッドが正しく、アクション URL が正しいことを確認する必要があります。

次に、これらのフォーム フィールドが投稿されたときに、投稿を受け取るアクション メソッドが必要です。そのアクション メソッドが GET で使用されるアクション メソッドと同じでない場合は、BeginForm() ヘルパーにポスト先を伝える必要があります。

MVC では、Web フォームのように考えて、すべてが自動的に行われると想定することはできません。自分ですべてを行う必要があり、すべてのリンク、すべてのアクション、すべてのセレクター、すべての JavaScript などがすべて正しいことを確認してください。これは WebForms よりも手間がかかりますが、より強力で効率的でもあります。

于 2013-09-16T07:34:31.163 に答える