25

デフォルトでは、ASP.NET MVC 3の新しいプロジェクトテンプレートは、デフォルトのレイアウト(かみそりのマスターページ)に以下を追加します。

<title>@ViewBag.Title</title>

次に、ページのタイトルを割り当てるには、ビューに次のものが含まれている必要があります。たとえば、次のようになります。

@{
     ViewBag.Title = "Log On";
}

おそらくそれは私自身の好みですが、ViewBagを使用してタイトルを保持するのが少し間違っていることに気付きました(私はあまりにも多くのマジックストリングフレーバーを考えています)。だから私の質問は:これはASP.NET MVC 3とかみそりを使用している人(動的プロパティバッグを使用している)に推奨されるベストプラクティスですか、それともより強く型付けされたもの(おそらくカスタムベースクラスを含む)を選択していますか?

4

8 に答える 8

28

asp.netMVC3に付属しているデフォルトのタイトル処理機能に問題はないと思います。

私は個人的にこれ(以下に書かれています)をタイトルを処理するために行います。以下のコードを承認したり、デフォルトの機能よりも優れていると言っているわけではありません。

マスター

<title>
    @RenderSection("Title");
</title>

意見

@section Title
{
    write title
}

デフォルトの機能を改善するために私が提案できることの1つ

@{
    string pageTitle = @ViewBag.Title ?? "Title Not Set";
}
<title>@pageTitle</title>

したがって、ビューバッグに追加するのを忘れると、ページにtitle=が表示されます。Title Not Set

基本クラスを作成してから、すべてのコントローラーをその基本クラスから継承させることもできます。しかし、私はそれがのために非常に多くの苦痛をとっていると思いますtitle

于 2011-08-08T09:05:01.757 に答える
7

タイトルのViewBagは完全に問題ありません(ViewBagを使用する目的であるとさえ言えます)-動的は絶対的な悪ではありません。「タイトル」はよく知られており、変更される可能性は低く、ビューテンプレートで事前定義されています。私は個人的に次のタイトルを使用します:

<title>@(ViewBag.Title == null ? string.Empty : ViewBag.Title + " | ")Site Name</title>

タイプミスが心配な場合はViewBag.Title、カスタムを作成して強い型にすることができますが、 IIRCのレンダリング中に作成されたインスタンスが複数あるため、その強い型のプロパティWebViewPageを使用するViewBagか、内部で使用する必要があります。HttpContext.ItemsWebViewPage

固執することをお勧めします。これはやり過ぎのように思われるため、ViewBag独自に作成することをお勧めしWebViewPageます。すでにカスタムを持っている場合は、単一のプロパティを作成することもWebViewPage、私の意見ではまったく価値のない複雑さです。これは、多くの場合、過剰に設計されている人から来ています。

于 2011-08-08T09:34:25.897 に答える
3

また、ViewBagはまったく使用していません。

_Layout.shtmlの上部に..。

@model <YourWebAppNameSpace>.Models.Base.EveryPageViewModel

_Layout.shtmlで..。

<title>@Model.Title</title>

あなたのモデルでは..。

/// <summary>
/// Index View Model
/// </summary>
public class IndexViewViewModel : EveryPageViewModel {

}

EveryPageViewModelで

/// <summary>
/// Every Page View Model
/// </summary>
public abstract class EveryPageViewModel {
    /// <summary>
    /// Title
    /// </summary>
    public string Title { get; set; }
    /// <summary>
    /// Sub Title
    /// </summary>
    public string SubTitle { get; set; }
}

コントローラーアクションで

    /// <summary>
    /// Index
    /// </summary>
    /// <returns></returns>
    public ActionResult Index() {
        var model = new IndexViewViewModel();
        model.Title = "Home";
        return View(model);
    }
于 2016-12-22T17:00:40.603 に答える
2

個々のViewBagを編集するのではなく、PageTitleActionFilter属性を作成するのが好きです。

使用法:ビューを同じに保つ

<title>@ViewBag.Title</title>

コントローラ全体のページタイトルの場合:

[PageTitle("Manage Users")]
public class UsersController : Controller {
    //actions here
}

個々のビューの場合:

public class UsersController : Controller {
    [PageTitle("Edit Users")]
    public ActionResult Edit(int id) {
          //method here
    }
}

属性コード:

public class PageTitleAttribute : ActionFilterAttribute
{
    private readonly string _pageTitle;
    public PageTitleAttribute(string pageTitle)
    {
        _pageTitle = pageTitle;
    }

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        base.OnActionExecuted(filterContext);
        var result = filterContext.Result as ViewResult;
        if (result != null)
        {
            result.ViewBag.Title = _pageTitle;
        }
    }
}

管理が簡単で、魅力のように機能します。

于 2015-03-20T14:13:30.053 に答える
1

個人的には、このケースはの許容できる使用法だと思いますViewBag。「よく知られている」物件に限定されており、今後問題となることはないでしょう。結局のところ、それは実用的であり、可能な限り迅速になる方法を見つけることです。タイトルを設定する必要がある基本クラスを持つことは、私の意見では、型安全性の価値があるにはコードが多すぎるでしょう。

幸運を!

于 2011-08-08T09:07:04.460 に答える
1

設定したいタイトルだけであれば、ViewBagを使っても大丈夫だと思います。まあ、多分それだけではありません-せいぜい2〜3のプロパティ。

しかし、すべてのコントローラーアクションでますます多くの(共通の)プロパティを設定していることに気づき始めたら、強く型付けされた「ViewModelBaseクラス」を使用します。しかし、それは私だけです。

于 2011-08-08T09:12:45.510 に答える
1

強力なタイトル設定をお勧めします。BaseControllerクラスからのサンプルはほとんどありません。(ページはカプセル化されたビューモーダルを定義します)

protected override ViewResult View(string viewName, string masterName, object model)
{
    if (model is Page)
    {
        ViewBag.Title = ((Page)model).Title;
        //HACK: SEO
        //TODO: SEO
    }
    return base.View(viewName, masterName, model);
}
于 2011-08-08T09:36:59.187 に答える
1

ViewBag.Title="マイタイトル";を使用しても問題はありません。

実行しているのは、動的プロパティを使用することだけです。

問題は、実際にはどこに情報を「宣言」すべきかということです。

つまり、目前の目的のために最もアクセスしやすい場所はどこですか。

ページごとの場合は、それが適切な場所です。

ただし、ページのタイトルをモデルから取得できる場合は、それを行う必要があります。

この場合、使用するViewModelの基本クラスを使用し、モデルのプロパティからページタイトルを取得するロジックを含むPageTitleプロパティを作成します。

それで:

<title>Model.PageTitle</title>

要約すると、コースの馬は、動的プロパティを使用することを恐れないでください...それらが何であるか、そしてそれらが何をするかを理解している限り。

于 2011-08-08T12:36:24.983 に答える