null@ViewBag.Title
のときに正しいページタイトルが含まれることがあるのはなぜですか?@Page.Title
ビュー/レイアウトコードをデバッグしていますが、この違いに気づきました。
ありがとう。
null@ViewBag.Title
のときに正しいページタイトルが含まれることがあるのはなぜですか?@Page.Title
ビュー/レイアウトコードをデバッグしていますが、この違いに気づきました。
ありがとう。
asp.Net MVC を使用している場合、ページにデータを取得するために使用できるツールがいくつかあります。
これらにはそれぞれ独自のユースケースがあります。使用する例は、基本的なリストと更新ビューです。会社のコレクション用です。
モデル
モデルは、ビューに送信される定義済みのデータセットがあり、ページのプライマリデータを含む必要がある場合に常に使用する必要があり、通常、モデルはページまたはコントローラーに固有です。
ビューバッグ
ビュー ツリー全体で使用されるモデルまたはデータで定義されていないページに一般的なデータを送信する必要がある場合は常に、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>
このアプリケーションのフローがどのように機能するかについて説明しましょう
モデルを使用して特定のデータをビューに送信しました。ViewBagを使用して、一般データをビューとレイアウトに送信しました。パラメータを使用せずにTempDataを使用して、アクション間でデータを渡しました。Cookieを使用して、しばらく変更されないデータを保存しました。
正しいのは usingです。これは、あなたのプロパティのViewBag.Title
コンテキストにあるためです.asp.net Webフォームからのものです. それがnullの理由です。コンテキストがありません。ViewBag
View
Page.Title
Page.Title