1

私はMVC4を初めて使用することから始めます...だから優しくしてください

私はモデルを持っています

public class LoginModel
{
    [Required]
    [Display(Name = "User name")]
    public string UserName { get; set; }

    [Required]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    public string Password { get; set; }

    [Display(Name = "Remember me?")]
    public bool RememberMe { get; set; }

    public double CurrentBalance { get; set; }
}

これは、標準のログイン モデルの単なる拡張であり、CurrentBalance 変数を追加しました。

次に、ユーザー名とパスワードを使用して別のシステムにログインするコードを AccountModel に追加しました。ログインが成功したら、返された値で CurrentBalacnce 値を更新し、RedirectToAction を使用してログイン ページを読み込みます。

[AllowAnonymous]
[HttpPost]
public ActionResult Login(LoginModel model, string returnUrl)
{
    if (ModelState.IsValid)
    {
        //Log into the server

        if (server_loggedIn)
        {
            server.LogOut();
        }
        if (server.LogIn("****", "****", "****") == 0)
        {
            if (server.GetUserInfoByUserName(model.UserName) == 0)
            {
                if (server.GetUserTransactionInfo(model.UserName) == 0)
                {

                    model.UserName = server.m_sLoggedInUser;
                    model.CurrentBalance = server.m_currentBalance;
                    FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);

                    return RedirectToAction("Index","Account", new {model});
                }
            }
          }
        else
        {
            ModelState.AddModelError("", "The user name or password provided is incorrect.");
        }
    }

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

ご覧のとおり、私は今のところ標準コードを使用して頭を丸めていますが、インデックスページをロードすると、モデルで null 値が取得されます

@model Print_Management.Models.LoginModel

@{
    ViewBag.Title = "Your Account";
}

@section Header {
    @Html.ActionLink("Back", "Index", "Home", null, new { data_icon = "arrow-l", data_rel = "back" })
    <h1>@ViewBag.Title</h1>
}

<p>
    Logged in as <strong>@User.Identity.Name</strong>.
    /n\nCurrent Balance <strong>@Model.CurrentBalance</strong>
</p>

<ul data-role="listview" data-inset="true">
    <li>@Html.ActionLink("Deposit", "ChangePassword")</li>
    <li>@Html.ActionLink("Log off", "LogOff")</li>
</ul>

私は非常に基本的な間違ったことをしていると確信しています...しかし、今後はビューとの間で変数を渡す必要があるため、どんな助けも大歓迎です..

前もって感謝します

4

1 に答える 1

4

リダイレクト時に複雑なオブジェクトを渡すことはできません。このモデルのどのプロパティをリダイレクトとともにクエリ文字列パラメータとして送信するかを明示的に決定する必要があります。

return RedirectToAction(
    "Index",
    "Account", 
    new {
        username = model.UserName,
        password = model.Password, // oops, be careful the password will appear in the query string
        rememberMe = model.RememberMe,
        currentBalance = model.CurrentBalance
    }
);

実際にこれを行う正しい方法は、リダイレクト時にパラメーターを送信しないことです。

return RedirectToAction("Index", "Account");

次に、ターゲット アクション内で、現在認証されているユーザーをフォーム認証 Cookie から取得できます。

[Authorize]
public ActionResult Index()
{
    string username = User.Identity.Name;

    // Now that you know who the current user is you could easily 
    // query your data provider to retrieve additional information about him
    ...
}
于 2013-01-04T16:13:30.170 に答える