1

マイページへのログインにDirectoryservicesを利用しています。すべてのページにユーザー名を表示するには、マスターページにユーザー名を渡す必要があります。

ユーザー名を取得し、ViewData に保存しました。masterpage で viewdata 値を渡す方法。
私のコード:

 [HttpPost]
    public ActionResult Index(LoginModels model)
    {
        if (ModelState.IsValid)
        {
            string DisplayUserName = string.Empty;
            string LoginUser = model.Userid;
            string LoginPassword = model.Password;    
            string  name = model.UserName
            if (ValidateActiveDirectoryLogin(LoginUser, LoginPassword, out DisplayUserName) == true)
            {
                model.UserName = DisplayUserName;
                ViewData["UserName"] = "Welcome" + DisplayUserName;
                return RedirectToAction("Index", "MPP", new { UserID = LoginUser });
            }          
            else
            {
                ModelState.AddModelError("","Invalid Username or Password");
            }               
        }
        return View();          
    }

レイアウトページで:

   @{  @ViewData["UserName"]   }


ユーザー名を表示するには、次の方法を試しました。しかし、それは nullexception をスローします。
編集 :

@foreach (var m in IEnumerable<SampleECommerce.Models.LoginModels>)ViewData["UserName"])
{ 
    @m.UserName
} 
4

4 に答える 4

4

文字列値を設定ViewData["UserName"]するとIEnumerable<SampleECommerce.Models.LoginModels>. 別の解決策は次のとおりです。

これをレイアウトページに入れます:

<span>@{Html.RenderAction("actionname", "controllername");}</span>

そして関連するアクションで:

 public ActionResult actionname() {
        string result = getusername();
        return Content(result);
    }


[NoneAction]
private string getusername(){
    return (Membership.GetUser()!= null) ? Membership.GetUser().UserName : "Guest";
}
于 2012-10-30T12:08:21.473 に答える
0

レイアウトページ:

<span>@{Html.RenderAction("actionname", "controllername");}</span>

コントローラーにセッション変数を保存します

 [HttpPost]
public ActionResult Index(LoginModels model)
{
      Session["username"] = model.UserName;
     //remaining code
}

もう1つ関数を追加

public ActionResult actionname() {

    return Content(Session["username"]);
}

したがって、ここでは追加の機能は必要ありません。

于 2015-09-16T08:29:22.937 に答える
0

余分な @ なしで試してみてください。

   @{  ViewData["UserName"]   }
于 2012-10-30T12:05:01.707 に答える
0

まず、構文を次のように変更する必要があります。

@(ViewData["UserName"])

それはおそらく最高です(悪い束の中で)。User現実的には、コントローラーのプロパティを介してユーザーをページのプロパティにプッシュすることを検討する必要がUserあります (通常、おそらく Cookie を読み取る認証属性内) ViewDataすべてのページで使用する何かの文字列。

とにかく...最後のreturn View();行のためにビューがレンダリングされている場合、私が示したように構文を変更すると、あなたがしようとしていることはうまくいきます。

そうでない場合、そしてそうするときはreturn RedirectToAction("Index", "MPP", new { UserID = LoginUser });、 UserName をプッシュして、コントローラーのアクションTempDataの開始時にそれを読み取る必要があります。IndexMPP

そう:

TempData["UserName"] = "Welcome " + DisplayUserName;
return RedirectToAction("Index", "MPP", new { UserID = LoginUser });

そして、Indexメソッドの開始時に値を から引き出す必要がありますTempData:

public class MPPController {
  public ActionResult Index(){
    ViewData["UserName"] = TempData["UserName"];
  }
}

なぜこれをしなければならないのですか?RedirectToActionはページをレンダリングしないため、クライアントに新しい URL に対して別の要求を行うように指示します。したがって、ViewDataサーバーに関する限り、モデルまたはすべてが破棄されます。 2 つの連続する要求TempDataの間の一時的なストレージを提供するためだけに存在するため、シナリオに適しています。RedirectToAction

私が言うように、これはコントローラーからビューにユーザー情報を保持するための実際には貧弱な方法であり、緊急の問題として真剣に再考する必要があります.

于 2012-10-30T12:09:49.093 に答える