1

null@ViewBag.Titleのときに正しいページタイトルが含まれることがあるのはなぜですか?@Page.Titleビュー/レイアウトコードをデバッグしていますが、この違いに気づきました。

ありがとう。

4

2 に答える 2

9

asp.Net MVC を使用している場合、ページにデータを取得するために使用できるツールがいくつかあります。

  1. ビューに送信するモデル。
  2. ビューバッグ。
  3. 温度データ。
  4. クッキー。
  5. セッション。

これらにはそれぞれ独自のユースケースがあります。使用する例は、基本的なリストと更新ビューです。会社のコレクション用です。

モデル

モデルは、ビューに送信される定義済みのデータセットがあり、ページのプライマリデータを含む必要がある場合に常に使用する必要があり、通常、モデルはページまたはコントローラーに固有です。

ビューバッグ

ビュー ツリー全体で使用されるモデルまたはデータで定義されていないページに一般的なデータを送信する必要がある場合は常に、ViewBag を使用する必要があります。

一時データ

一時データは、名前が一時データのストレージを示しているため、データが宛先に到達するかどうかわからない場合、またはパラメーターを追加せずにアクション間でデータを渡したい場合に使用する必要があります。

クッキー

Cookie は、アプリケーション全体のデータをホストするグローバル変数のようなものです。

セッション

Cookie のようなセッションはグローバル変数ですが、セッションの存続期間が異なります。セッションは、リクエスト間のフォーム データの保存などに使用できます。セッションを使用してこれを行うのではなく、 http: //garlicjs.org/

例を見てみましょう 次のViewModelがあります

public class Company 
{
  public int? id { get; set; }
  public string Name { get; set; }
  public string Description { get; set; }
}

レイアウトページはこんな感じ

<!DOCTYPE html>

<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    //This looks for the Title property on the ViewBag and inserts it in the title tags
    <title>@ViewBag.Title</title>
</head>
<body>
   @Html.Action("Header", "PageElements")
   @RenderBody()
</body>
</html>

PageElements コントローラーのヘッダー アクションは次のようになります。

public PartialViewResult Header()
{
  ViewBag.CurrentLink = HttpContext.Current.Request.Cookies["CurrentLink"];

  return PartialView();
}

ヘッダー部分ビューは次のようになります

<header>
   <ul> 
      <li class="@(ViewBag.CurrentLink == "Home" ? "Current" : "")"> 
          @Html.ActionLink("Home", "Index", "Home")
      </li>
      <li  class="@(ViewBag.CurrentLink == "Companies" ? "Current" : "")"> 
          @Html.ActionLink("Companies", "Index", "Companies")
      </li>
   </ul>
</header>

更新のコントローラー アクションは次のようになります。

public ViewResult Update(int id)
{  

  //Gets a company from the database
  var model = db.GetCompany(id);

  //Sets The Title property on the ViewBag to Update : CompanyName
  ViewBag.Title = String.Format("Update : {0}", model.Name);  

  //Sends the company to the view
  return View(model);
}

更新ビューは次のようになります

@model Application.Models.Company
@{
   Layout = "_layout.cshtml";
}

@using (Html.BeginForm())
{ 
   @Html.HiddenFor(model => Model.id)

   @Html.LabelFor(model => Model.Name)
   @Html.TextBoxFor(model => Model.Name)

   @Html.LabelFor(model => Model.Description)
   @Html.TextAreaFor(model => Model.Description)
   <button>Submit</button>
}

更新のポスト アクションは次のようになります。

[HttpPost]
public ActionResult Update(Company model)
{ 
  //Attempts to update the model 
  if (model.Update())
  {
     //Set the message to update succeeded
     TempData["Message"] = String.Format("{0} Successfully updated");
  }
  else   
  {
     //Set the message to update failed
     TempData["Message"] = String.Format("{0} filed to update");
  } 

  return RedirectToAction("Index");
}

企業のコントローラ アクションは次のようになります。

public ViewResult Index()
{
  //Index is the entrypoint for companies so we set the currentlink to companies while we are in companies
  HttpContext.Current.Request.Cookies["CurrentLink"] = "Companies";      

  //Gets the success or failure message from the temp data
  ViewBag.Message = TempData["Message"]; 

  //Sets The Title property on the ViewBag to List of companies
  ViewBag.Title = "List of companies";

  var model = db.GetAllCompanies();

  return View(model);
}

リストのビューは次のようになります

@model IEnumrable<Application.Models.Company>
@{
   Layout = "_layout.cshtml";
}
<span>@ViewBag.Message</span>
<ul>
@foreach (var company in Model) 
{
  <li>@company.Name : @company.Description @Html.AnchorLink("Edit", "Update", new { company.id}) </li>
}
</ul>

このアプリケーションのフローがどのように機能するかについて説明しましょう

  1. インデックス アクションは、企業に対してトリガーされます。
  2. 企業への現在のリンクをCookieに設定します
  3. 次に、ViewBagに Title を設定します。
  4. メッセージの TempData をチェックし、それらをViewBagに入れます。
  5. 次に、企業のコレクションをモデルに入れ、ページに送信します。
  6. カミソリが起動し、最初にページのレンダリングを開始します
  7. 次に、レイアウトがレンダリングされ、ViewBagから Title 値が取得されます
  8. 次に、ヘッダーの部分ビューがレンダリングされ、Cookieから currentlink 値が取得されます
  9. 会社の更新ボタンをクリックします
  10. 更新アクションが実行されます
  11. データベースから会社を取得し、モデルのビューに送信します
  12. ViewBagで更新するタイトルを変更します
  13. ページが最初にレンダリングされ、モデルから企業データがフォームに配置されます
  14. 次に、レイアウトがレンダリングされ、ViewBagからタイトル値を取得します
  15. 次に、ヘッダーがレンダリングされ、Cookieから現在のリンクが取得されます (値は変更する必要のない会社のままです)。
  16. 次に、フォームを送信し、TempDataにメッセージを追加します。
  17. 会社リストに戻り、 TempDataから成功または失敗のメッセージを取得できます。

モデルを使用して特定のデータをビューに送信しました。ViewBagを使用して、一般データをビューとレイアウトに送信しました。パラメータを使用せずにTempDataを使用して、アクション間でデータを渡しました。Cookieを使用して、しばらく変更されないデータを保存しました

于 2013-03-04T19:56:31.930 に答える
4

正しいのは usingです。これは、あなたのプロパティのViewBag.Titleコンテキストにあるためです.asp.net Webフォームからのものです. それがnullの理由です。コンテキストがありません。ViewBagViewPage.TitlePage.Title

于 2013-03-04T16:32:23.967 に答える