2017-01-16 6 views
1

私は自分自身にasp.net C#MVCを教えています。データをビューに戻す方法を理解していません。グローバルオブジェクトをビューに戻す

すべてのチュートリアルの例は些細すなわち 1)あなたが本オブジェクトを作成し、コントローラでモデル(書籍) 2)を作成し(とのViewModelにコピー)すなわち著者やタイトルやチャプターのコレクションです。 3)ビュー内のView Modelオブジェクト、つまり@ Model.Titleなどを参照してください。

私の場合、以前に作成されたオブジェクトがあり、そのオブジェクトをビューに戻したいと思います。

たとえば、コントローラー1で作成された図書が図書館にあるとします。 (これは、BOOK1と呼ばれ、その後、ビューに戻される

私はBOOK1に新しい章が追加されます別のコントローラ(コントローラ2)を持つ

だから、質問は次のとおりです。。

a)はどこにありますすべてのコントローラで参照できるようにbook1を作成するには最適な場所ですか? b)book1オブジェクトが作成されると、ビューにどのように戻されますか?私の例では、特定のコントローラー内で作成されたオブジェクトだけが関連付けられたビューに返されるようです。

答えて

1

実際には、コントローラは作成するオブジェクトをキャッシュしてはいけません。 GET Editユースケースを持っている場合は、データベースにオブジェクトを保存して再度取得させます。 リクエスト間の状態を覚えたくありません(RESTfulアーキテクチャ)。 これは、アクションとして必要なすべてのデータをパラメータとして送信する必要があることを意味します。

したがって、CreateBookアクションを持つBookControllerがあるとします。 この操作では、作成したブックのIDをデータベースに戻す必要があります。 (または、ブックを編集するActionLinksが正しいIDで初期化されているビューを返します)。 このIDは、既存の書籍を編集するすべての操作に渡される必要があります。例えば

は、ブックが作成された後に表示されますビューで:

ここ
@Model ExistingBookViewModel 

@Html.ActionLink("Add chapter", "AddChapter", "Chapter", new { bookId = Model.Id }) 

を、ExistingBookViewModel.Idは、作成したブックのIDであるとBookControllerに設定してください。

次に、あなたのChapterControllerはこのようAddChapterアクションを定義することができます。

[HttpGet] 
public ActionResult AddChapter(long bookId) { 
    var book = dbContext.Books.Find(bookId); 
    var viewModel = new AddChapterViewModel { 
     BookId = bookId, 
     BookName = book.Name, 
     ChapterName = string.Empty // to be provided by User in AddChapter view 
     // ... 
    }; 
    return View("AddChapter", viewModel); 
} 

[HttpPost] 
public ActionResult AddChapter(AddChapterViewModel postData) { 
    var book = dbContext.Books.Find(postData.BookId); 

    var newChapter = new Chapter { 
     Name = postData.ChapterName, 
     // ... 
    }; 

    book.Chapters.Add(newChapter); 
    dbContext.SaveChanges(); 
    return new HttpStatusCodeResult(HttpStatusCode.OK); 
} 
+0

私の意見では良い答えです。ちょうど1つの詳細 - HttpStatusCodeResultではなくViewに更新されたブックモデルを返すことができます。 –

+0

詳しい返答をよろしくお願いします! – Tysondotnet

0

A)私は、任意のコントローラファイルとは別のモデルを維持し、それが名前空間を含むことにより、必要なの任意のコントローラ/ビューでそれを参照します。これは組織化された状態を保つでしょう。

b)Controller.Viewメソッドを使用して、任意のモデルをビューに渡すことができますが、ビューでそのモデルを定義する必要があります(例:@model MyApp.Models.MyModel)。そこからモデルをビューにバインドしてデータを表示することができます。

0

静的変数を任意のクラスに作成すると、他のクラスでもアクセスできます。

なぜオブジェクトを再度選択しないのですか?パフォーマンスは素晴らしいですが、単純でバグのないアルゴリズムがはるかに重要です。

データベースをキャッシュしたい場合は、SQL文のキャッシュ結果を考えるには:

string sql = "select ..."; 
string hash = "book_" + sql.GetHashCode(); 
Book b = null; 
if (HttpRuntime.Cache[hash] != null) 
{ 
    b = (Book)HttpRuntime.Cache[hash]; 
} 
else 
{ 
    b = SelectBookFromSql(sql); 
    HttpRuntime.Cache[hash] = b; 
} 
関連する問題