2009-08-29 17 views
8

あるコントローラアクションから別のアクションにオブジェクトを渡そうとしています。複雑なディープオブジェクトのRedirectToAction(..)が失敗する

public class DialogController : Controller 
{ 
    public ActionResult Index() 
    { 
     // Complex object structure created 
     Person person = new Person(); 
     person.PhoneNumbers = new List(); 
     person.PhoneNumbers.Add("12341324"); 

     return RedirectToAction("Result", "Dialog", person); 

    } 

    public ActionResult Result(Person person) 
    { 
     string number = person.PhoneNumbers[0].ToString(); 
     return View(); 
    } 
} 

の電話番号リストは突然であるため、結果メソッドがnullポインタ例外で失敗します。

私のコントローラは、このようになります

public class Person 
{ 
    public string Name { get; set; } 
    public List<PhoneNumber> PhoneNumbers {get; set; } 
    public List<Address> Addresses { get; set; } 
} 
:私は周りに渡しているオブジェクトは、多かれ少なかれ、このようになります。 RedirectToAction()メソッドでResultアクションを呼び出した後にnullを返します。

誰もこのタイプの動作を以前に見たことがありますか?

乾杯、

ピーター

答えて

5

私は@Dennisに同意します - あなたがURLを変更しない限り、何か他のことを考える必要があります。その理由は、RedirectToActionがデータをシリアル化しないため、キーがプロパティ名で、値がプロパティ値の文字列表現であるクエリ文字列を構築するルート値オブジェクトのプロパティを反復処理するだけです。 Urlを変更したい場合は、TempDataを使用するのが最も簡単な方法ですが、データベースにアイテムを格納し、IDをResultメソッドに渡してそこから再構成することもできます。

+0

こんにちはT、 私はTempDaataトリックを使ってオブジェクトをあるアクションから別のアクションに移しました。 RedirectToActionの仕組みを整理してくれてありがとう。それが私の本当の混乱の部分でした。 –

7

あなたが本当に他のアクションにリダイレクトする必要がありますか? RedirectToActionは、新しいhttp要求を引き起こします。そのため、TempDataが機能します。あなたはこのような行動を直接Resultと呼ぶことはできませんでしたか?

public ActionResult Index() 
{ 
    // Complex object structure created 
    Person person = new Person(); 
    person.PhoneNumbers = new List(); 
    person.PhoneNumbers.Add("12341324"); 

    return Result(person); 

} 

編集のアプリは、あなたが疑問に示したもの以上のものをやっている場合を除き、あなたが本当にindexアクションを必要とするように、それは見ていません。新しい人物を作成するコードを専用のCreatePersonメソッドに移動することができます。 Resultアクションでpersonがnullの場合は、CreatePersonメソッドを呼び出します。 Indexアクションは完全に排除できますが、ルートを変更する必要があります。または、Indexアクションではreturn RedirectToAction("Result", "Dialog");をコードラインにするだけです。

実際には、MVCの懸念事項を除いて、そのCreatePersonメソッドはおそらくモデルコード内のメソッドであるはずです。コントローラーは、新しいPersonを作成するロジックを含む必要はありません。それは実際にモデルに属します。

+0

こんにちはデニス、 答えを 感謝を。 Personオブジェクトの作成についてはまったく正しいです。 ありがとう! –

2

これは古い質問ですが、私は重複した質問だと信じているところでgreat answer to itを見つけました。キーはRouteValueDictionaryコンストラクタです。

return RedirectToAction("Result", "Dialog", new RouteValueDictionary(person)) 

コレクションを持っているので、それは少しトリッキーになります。but this other answer covers this very nicely

0

誰もが実際に何らかのアクションを呼び出し、複雑なオブジェクトを持つ別のコントローラからビューを返す必要があり、TempDataにオブジェクトを渡したくない(またはできない)必要があります。私は私のアプリでは非常に醜い使用しますが、作業溶液:答えに触発

protected ActionResult InternalRedirectToAction(string action, string controller, object model) 
{ 
    var htmlHelper = new HtmlHelper(new ViewContext(
           ControllerContext, 
           new WebFormView(ControllerContext, "HACK"), 
           new ViewDataDictionary(), 
           TempData, //for sharing TempData between Actions 
           new StringWriter()), 
         new ViewPage()); 

    var otherViewHtml = htmlHelper.Action(action, controller, model); 
    return Content(otherViewHtml.ToString()); 
} 

はこちらをご覧ください:https://stackoverflow.com/a/4360019/1341409

関連する問題