1

すべての値をモデル フィールドに収集するために、あるコントローラー メソッドから別のコントローラー メソッドにモデルを渡しています。私は以下のようにやっています

[HttpPost]
    public ActionResult A(Model m, string s)
    {
        if (ModelState.IsValid) 
        {
            if (m.l == null || m.k == null)
            {
                //Do something.

            }
            else
                return View("B", m); // this is where by debug point comes...
        }

        return View(m);


    }


public ActionResult B(Model m)
    {

        return View(m);
    }

[HttpPost]
    public ActionResult B(Model m, string s)
    {
        if (ModelState.IsValid)
        {
            if (m.p == null || m.j == null)
            {
                //do something
            }
            else
            {
               // do something and redirect to somewhere else 
            }


        }

しかし、私が示したように、デバッグポイントは以下に示すようにここに来ます.

return View("B", m);

これはコントローラメソッド「B」にヒットするはずですが、問題はコントローラメソッド「B」にヒットしないことです。しかし、コントローラーメソッド「B」のビューが表示されるため、この問題について混乱しています。また、メソッド「B」の httppost に (l,k) の値が表示されません。この理由は何ですか。

私はこれを正しいか間違っているかを知りたいです。私がこれを間違っている場合は、これについて少し説明してください。MVCが得意な人が助けてくれますか。前もって感謝します。

4

4 に答える 4

7

そのコード -- -- 実際にはアクションreturn View("B", m)B にリダイレクトせず、指定されたモデルでビューB をレンダリングするだけです。アクションを実行する場合は、次を使用する必要があります。

return B(m);
于 2012-08-22T05:50:19.253 に答える
2

別のアクションからアクションを呼び出さないでください。ビュー RESULT は、コントローラーのアクション メソッド (一番上のもの) が実行された後に実行されます。別のアクションを呼び出すことは意図されておらず、同じアクション メソッドへの複数の経路を提供する可能性があります。コントローラーの目的は、データを調整することです。複数のメソッドを呼び出す必要があると思われる場合は、それらを他のファサード クラスまたはサービス レイヤー クラスに分割して、それを必要とする各コントローラーがそれを要求するか、この情報をドメイン オブジェクトに集約してからビュー モデルに入力する必要があります。

これのいずれかが明確でない場合は、さらに明確にします。

複数のリポジトリ メソッドを呼び出してデータを取得し、ビュー モデルに入力するか、親ビューを使用してビュー内から RenderAction を呼び出し、他のコントローラー データを出力します。

または、RenderPartial を使用して親ビュー オブジェクトを使用し、各子ビューに渡してその部分をレンダリングしますが、すべてのデータを最上位ビューのビュー モデルで使用できるようにする意味がない限り、RenderAction の方が好きです。または、コントローラーからファサードレイヤークラスを呼び出し、さまざまな場所からデータを取得し、xyz を実行してコントローラーに返します。コントローラーは、このデータからビューモデルを作成します。

于 2012-08-22T06:47:17.707 に答える
1

このようなことを試してください、

[HttpPost]
public ActionResult A(Model m, string s)
{
    if (ModelState.IsValid) 
    {
        if (m.l == null || m.k == null)
        {
            //Do something.                    
        }
        else
            RedirectToAction("B", m); // check this
    }
    return View(m);    
}   

public ActionResult B(Model model)
{
    return View(model);
}
于 2012-08-22T06:33:56.357 に答える
1

以下のコードを試してください。それはうまくいくはずです。これは、@dbaseman の回答に代わるものです。

    [HttpPost]
    public ActionResult A(Model m, string s)
    {
        if (ModelState.IsValid) 
        {
            if (m.l == null || m.k == null)
            {
                //Do something.                    
            }
            else
            {
                TempData["tempModel"]=m; //cannot pass a model in a redirect method. so store it in a tempdata object.
                return RedirectToAction("B"); // redirect to action method B
            }
        }
        return View(m);    
    }   

    public ActionResult B()
    {
        Model model= new Model();
        if(TempData["tempModel"]!=null)
            model=(Model)TempData["tempModel"];
        return View(model);
    }
于 2012-08-24T11:19:48.943 に答える