0

2 つのアクション結果間でデータを渡す必要があるので、試してみようと思いましTempDataた (MVC は初めてなので、ご容赦ください)。これは私が試したことです:

public ActionResult Edit(Companies companies, HttpPostedFileBase file)
        {
            if (ModelState.IsValid)
            {
                try
                {
                    if (file != null)
                    {
                        //Do stuff with file, save changes to database etc.

                        TempData["Companies"] = companies;

                        return RedirectToAction("bgcTest2", "Companies");

これで一時データが保存されます。そしてそれを取得するには:

public ActionResult bgcTest2(string BolagsID, Companies companies)
        {
            try
            {
                companies = TempData["Companies"] as Companies;
                int test = companies.BolagsID;

ここに問題があります。companies.BolagsID値がtestありますが、常に null です。なんで?どうすれば修正できますか?

編集:

かなり興味深いことに気付きました。ダリン・ディミトロフの提案を試すとき、そしておそらく私の試みも行うとき、ヌル値を返す行にのみブレークポイントを配置すると、次の行までブレークしません。その行がコメントアウトされていて、まったく実行されていないかのように。トワイライトゾーンへようこそ。

EDIT2:

テイク 2:

[HttpPost]
        public ActionResult Edit(Companies companies, HttpPostedFileBase file)
        {
            if (ModelState.IsValid)
            {
                try
                {
                    if (file != null)
                    {
                        // non related stuff

                        return RedirectToAction("bgcTest2", "Companies", new {BolagsID = companies.BolagsID});

と:

[Authorize]
        public ActionResult bgcTest2(int BolagsID)
        {
            try
            {
                int test = BolagsID;

「現在のコンテキストにはテストが存在しません」というメッセージが表示されます。

EDIT3:

Take 2 で問題なく動作します。私の変数はnull、どこでも使用したことがないため、宣言されていました。私は一度に 1 つずつ実行すると思っていましたが、明らかに、場合によっては、それらのいずれかが機能することを確認するためにいくつかの手順を実行する必要があります。

教訓: 宣言された変数を必ず使用してくださいnull

4

1 に答える 1

3

セッションに依存しているため、TempData を使用しないことをお勧めします。必要なのはこれBolagsIDだけの場合は、パラメーターとして渡すだけです。

public ActionResult Edit(Companies companies, HttpPostedFileBase file)
{
    if (ModelState.IsValid)
    {
        try
        {
            if (file != null)
            {
                //Do stuff with file, save changes to database etc.
                return RedirectToAction("bgcTest2", "Companies", new { BolagsID = companies.BolagsID });

その後:

public ActionResult bgcTest2(int bolagsID)
{
    ... use the bolagsID here directly
}

残念ながら、このアプローチを使用して複雑なオブジェクトを渡すことはできません。ただし、このオブジェクトをデータストアに保持し、リダイレクト後にこのデータストアからオブジェクトを取得できるようにするターゲット コントローラー アクションに id のみを渡すことができます。

于 2013-05-16T06:16:30.337 に答える