このドキュメントでは、ASP.NET MVC 2 で導入された新機能と機能強化について説明します。
はじめに
ASP.NET MVC 1.0 プロジェクトの ASP.NET MVC 2 へのアップグレード
新機能
テンプレート化されたヘルパー
領域
非同期コントローラーのサポート
Action-Method パラメーターでの DefaultValueAttribute のサポート
モデル バインダーを使用したバイナリ データのバインドのサポート
ModelMetadata および ModelMetadataProvider クラス
DataAnnotations 属性のサポート
モデル検証コントロール プロバイダー
クライアント側の検証
Visual Studio 2010 の新しいコード スニペット
新しい RequireHttpsAttribute アクション フィルター
HTTP メソッド動詞のオーバーライド
テンプレート化されたヘルパー用の新しい HiddenInputAttribute クラス
Html.ValidationSummary ヘルパー メソッドでモデル レベルのエラーを表示できる
Visual Studio の T4 テンプレートが .NET Framework のターゲット バージョンに固有のコードを生成API の機能強化
破壊的変更
免責事項
はじめに
ASP.NET MVC 2 は ASP.NET MVC 1.0 を基にして構築されたものであり、生産性の向上に重点を置いた数多くの機能強化、機能が導入されています。 このリリースは ASP.NET MVC 1.0 と互換性があるため、ASP.NET MVC 1.0 の知識、スキル、コード、拡張機能のすべてを引き続き応用することができます。
ASP.NET MVC の詳細については、次のリソースを参照してください。
ASP.NET MVC 1.0 プロジェクトの ASP.NET MVC 2 へのアップグレード
ASP.NET MVC 2 は、ASP.NET MVC 1.0 と同じサーバー上に共存させる形でインストールできます。そのためアプリケーション開発者は、ASP.NET MVC 1.0 アプリケーションを ASP.NET MVC 2 にアップグレードするタイミングを柔軟に選択できます。 アップグレード方法については、「ASP.NET MVC 1.0 アプリケーションの ASP.NET MVC 2 へのアップグレード」のドキュメントを参照してください。
新機能
このセクションでは、MVC 2 リリースで導入された機能について説明します。
テンプレート化されたヘルパー
テンプレート化されたヘルパーを使用すると、編集および表示用の HTML 要素をデータ型に自動的に関連付けることができます。 たとえば、System.DateTime 型のデータをビューに表示させるときに、日付選択の UI 要素を自動的にレンダリングできます。 これは、ASP.NET 動的データのフィールド テンプレートの仕組みに似ています。 詳細については、MSDN Web サイトの「テンプレート化されたヘルパーを使用したデータの表示」を参照してください。
領域
区分を使用すると、大規模なプロジェクトを複数の小さなセクションに整理できるため、大規模な Web アプリケーションの複雑さの管理に役立ちます。 各セクション (区画) は通常、大規模な Web サイトの個別のセクションを表し、関連するコントローラーとビューのセットをグループ化するために使用されます。 詳細については、MSDN Web サイトの「チュートリアル: 区分による ASP.NET MVC アプリケーションの編成」を参照してください。
新しい区分を作成するには、ソリューション エクスプローラーで、プロジェクト名を右クリックし、[追加] をクリックして、[区分] をクリックします。 区分の名前の入力を求めるダイアログ ボックスが表示されます。 区分の名前を入力すると、Visual Studio によって新しい区分がプロジェクトに追加されます。
次の図は、Admin と Blogs という 2 つの区分を持つプロジェクトのレイアウトの例を示しています。
区分を作成すると、Visual Studio は AreaRegistration から派生するクラスを各区分に追加します。 このクラスは、次の例に示すように、区分とそのルートを登録するために必要です。
namespace MyApplication.Areas.Blog {
public class BlogAreaRegistration : AreaRegistration {
public override string AreaName {
get { return "blog"; }
}
public override void RegisterArea(AreaRegistrationContext context) {
context.MapRoute(
"blog_default",
"blog/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional }
);
context.MapRoute(
"blog_whatsnew",
"whats-new",
new { action = "WhatsNew", id = UrlParameter.Optional }
);
}
}
}
ASP.NET MVC 2 の既定のプロジェクト テンプレートでは、Global.asax ファイルのコード内に RegisterAllAreas メソッドへの呼び出しが含まれています。 このメソッドは、AreaRegistration クラスから派生するすべての型を検索し、型のインスタンスをインスタンス化し、そのインスタンスで RegisterArea メソッドを呼び出すことで、プロジェクト内の各区分を登録します。 以下の例は、これがどのように実行されるかを示しています。
public class MyMvcApplication : HttpApplication {
void App_Start() {
AreaRegistration.RegisterAllAreas();
RegisterRoutes(RouteTable.Routes);
}
public static void RegisterRoutes(RouteCollection routes) {
routes.MapRoute("default", "{controller}/{action}/{id}", ...);
}
}
context.Namespaces.Add メソッドを呼び出して RegisterArea メソッドで名前空間を指定しない場合、登録クラスの名前空間が規定で使用されます。
非同期コントローラーのサポート
ASP.NET MVC 2 で、コントローラーが要求を非同期的に処理できるようになりました。 これにより、ブロック操作 (ネットワーク要求など) を頻繁に呼び出すサーバーが、その操作に対応する非ブロック操作を代わりに呼び出せるようになるため、パフォーマンスが改善される可能性があります。 詳細については、MSDN の「ASP.NET MVC での非同期コントローラーの使用」のトピックを参照してください。
Action-Method パラメーターでの DefaultValueAttribute のサポート
System.ComponentModel.DefaultValueAttribute クラスを使用すると、アクション メソッドの引数パラメーターに規定値を指定できます。 たとえば、次の既定のルートが定義されているとします。
{controller}/{action}/{id}
また、次のコントローラーとアクション メソッドが定義されているとします。
public class ArticleController {
public ActionResult View(int id, [DefaultValue(1)]int page) {
}
}
次の要求 URL のいずれかが、前の例で定義されている View アクション メソッドを呼び出します。
- /Article/View/123
- /Article/View/123?page=1 (実質的に前の要求と同じ)
- /Article/View/123?page=2
DefaultValueAttribute 属性がない場合、ページ引数が値が指定されていない null 非許容の値の型であるため、前のリストの最初の URL は機能しません。
コードが Visual Basic 2010 または Visual C# 2010 で記述されている場合、次の例に示すように、DefaultValueAttribute 属性の代わりに省略可能なパラメーターを使用できます。
Function View(ByVal id As Integer, Optional ByVal page As Integer = 1) _
As ActionResult
' ...
End Function
public ActionResult MyAction(int id, int page = 1) {
// ...
}
モデル バインダーを使用したバイナリ データのバインドのサポート
バイナリ値を base-64 でエンコードされた文字列としてエンコードする Html.Hidden ヘルパーの新しいオーバーロードとして、以下の 2 つがあります。
public static string Hidden(this HtmlHelper htmlHelper, string name, Binary value);
public static string Hidden(this HtmlHelper htmlHelper, string name, byte[] value);
一般的な用途は、オブジェクトのタイムスタンプをビューに埋め込むことです。 たとえば、アプリケーションに次の Product オブジェクトが含まれている場合があります。
public class Product {
//... other properties ...
public byte[] TimeStamp {
get;
set;
}
}
編集フォームでは、次の例に示すように、フォームに TimeStamp プロパティをレンダリングできます。
<%@ Page Inherits="ViewPage<Product>" %>
<%= Html.Hidden("TimeStamp", Model.TimeStamp) %>
このマークアップは、タイムスタンプ値を持つ非表示の入力要素を、次の例のような base-64 でエンコードされた文字列としてレンダリングします。
<input type="hidden" name="TimeStamp" value="QVNQLk5FVCBNVkMgaXMgZnVuIQ==" />
このフォームは、次の例に示すように、Product 型の引数を持つアクション メソッドにポストされる場合があります。
public ActionResult Edit(Product p) {
// p.TimeStamp is populated from the form
}
アクション メソッドでは、ポストされた base-64 でエンコードされた文字列がバイト配列に変換されるため、TimeStamp プロパティが正しく設定されます。
ModelMetadata および ModelMetadataProvider クラス
ModelMetadataProvider クラスは、ビュー内のモデルのメタデータを取得するための抽象化を提供します。 MVC 2 には、System.ComponentModel.DataAnnotations 名前空間の属性によって公開されているメタデータを使用できるようにする既定のプロバイダーが含まれています。 データベースや XML ファイルなど、他のデータ ストアからメタデータを提供するメタデータ プロバイダーを作成できます。
ViewDataDictionary クラスは、ModelMetadataProvider クラスによってモデルから抽出されたメタデータを含む ModelMetadata オブジェクトを公開します。 これにより、テンプレート化されたヘルパーはこのメタデータを使用し、それに応じて出力を調整できるようになります。
詳細については、ModelMetadata および ModelMetadataProvider クラスのドキュメントを参照してください。
DataAnnotations 属性のサポート
ASP.NET MVC 2 では、入力検証を提供するためにモデルにバインドするときに、RangeAttribute、RequiredAttribute、StringLengthAttribute、RegexAttribute 検証属性 (System.ComponentModel.DataAnnotations 名前空間で定義) の使用がサポートされています。
詳細については、MSDN Web サイトの「方法: DataAnnotations 属性を使用してモデル データを検証する」を参照してください。 これらの属性の使用法を示すサンプル プロジェクトは、https://go.microsoft.com/fwlink/?LinkId=157753 でダウンロードできます。
モデル検証コントロール プロバイダー
モデル検証プロバイダー クラスは、モデルの検証ロジックを提供する抽象化を表します。 ASP.NET MVC には、System.ComponentModel.DataAnnotations 名前空間に含まれる検証属性に基づく既定のプロバイダーが含まれています。 カスタム検証規則と、検証規則のモデルへのカスタム マッピングを定義する独自の検証プロバイダーを作成することもできます。 詳細についてはModelValidatorProvider クラスのドキュメントを参照してください。
クライアント側の検証
モデル検証コントロール プロバイダー クラスは、クライアント側の検証ライブラリで使用できる JSON シリアル化されたデータの形式で検証メタデータをブラウザーに公開します。 ASP.NET MVC 2 には、前述の DataAnnotations 名前空間検証属性をサポートするクライアント検証ライブラリとアダプターが含まれています。 プロバイダー クラスを使用する場合、JSON データを処理し、代替ライブラリを呼び出すアダプターを書き込むことで、他のクライアント検証ライブラリを使用できるようになります。
Visual Studio 2010 の新しいコード スニペット
ASP.NET MVC 2 の HTML コード スニペットのセットが、Visual Studio 2010 とともにインストールされます。 これらのスニペットの一覧を表示するには、[ツール] メニューで [コード スニペット マネージャー] を選択します。 言語として HTML を選択し、場所として ASP.NET MVC 2 を選択します。 コード スニペットの使用方法の詳細については、Visual Studio のドキュメントを参照してください。
新しい RequireHttpsAttribute アクション フィルター
ASP.NET MVC 2 には、アクション メソッドとコントローラーに適用できる新しい RequireHttpsAttribute クラスが含まれています。 既定では、フィルターは非 SSL (HTTP) 要求を同等の SSL 対応 (HTTPS) 要求にリダイレクトします。
HTTP メソッド動詞のオーバーライド
REST アーキテクチャ スタイルを使用して Web サイトを構築する場合、リソースに対して実行するアクションを決定するために HTTP 動詞が使用されます。 REST の場合、アプリケーションが GET、PUT、POST、DELETE などの一般的な HTTP 動詞のすべてをサポートしている必要があります。
ASP.NET MVC 2 には、アクション メソッドに適用できる、コンパクトな構文を特徴とする新しい属性が含まれています。 これらの属性により、ASP.NET MVC が HTTP 動詞に基づいてアクション メソッドを選択できるようになります。 次の例では、POST 要求は 1 番目のアクション メソッドを呼び出し、PUT 要求は 2 番目のアクション メソッドを呼び出します。
[HttpPost]
public ActionResult Edit(int id)
[HttpPut]
public ActionResult Edit(int id, Tag tag)
以前のバージョンの ASP.NET MVC では、次の例に示すように、これらのアクション メソッドにより詳細な構文が必要でした。
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(int id)
[AcceptVerbs(HttpVerbs.Put)]
public ActionResult Edit(int id, Tag tag)
ブラウザーでは GET および POST HTTP 動詞のみがサポートされるため、異なる動詞を必要とするアクションにポストすることはできません。 したがって、すべての RESTful 要求をネイティブにサポートすることはできません。
ただし、POST 操作中に RESTful 要求をサポートするために、ASP.NET MVC 2 で新しい HttpMethodOverride HTML ヘルパー メソッドが導入されています。 このメソッドは、フォームが実質的に任意の HTTP メソッドをエミュレートできるようにする非表示の入力要素をレンダリングします。 たとえば、HttpMethodOverride HTML ヘルパー メソッドを使用して、フォームの送信を PUT あるいは DELETE 要求であるかのように扱うことができます。 HttpMethodOverride の動作は、次の属性に影響します。
- HttpPostAttribute
- HttpPutAttribute
- HttpGetAttribute
- HttpDeleteAttribute
- AcceptVerbsAttribute
非表示の入力要素の名前は X-HTTP-Method-Override で、その値はエミュレートする HTTP 動詞に設定されます。 オーバーライド値は、HTTP ヘッダーまたはクエリ文字列値で名前と値のペアとして指定することもできます。
オーバーライドは、実際の要求が POST 要求である場合にのみ使用できます。 他の HTTP 動詞を使用する要求では、オーバーライド値は無視されます。
テンプレート化されたヘルパー用の新しい HiddenInputAttribute クラス
新しい HiddenInputAttribute 属性をモデル プロパティに適用して、エディター テンプレートでモデルを表示するときに非表示の入力要素をレンダリングするかどうかを指定できます。 (この属性は、HiddenInput の暗示的な UIHint 値を設定します)。 属性の DisplayValue プロパティを使用して、エディターおよび表示モードで値を表示させるかどうかを指定できます。 DisplayValue を false に設定すると、通常であればフィールドの周囲にある HTML マークアップを含め、何も表示されなくなります。 DisplayValue の既定値は true です。
HiddenInputAttribute 属性は次のシナリオで使用できます。
- ユーザーがビューでオブジェクトの ID を編集できる場合で、値を表示するとともに古い ID を含む非表示の入力要素を指定して、これをコントローラーに返せるようにする必要がある場合。
- ユーザーがビューで、タイムスタンプ プロパティなどの表示されるべきではないバイナリ プロパティを編集できる場合。 その場合、値と周囲の HTML マークアップ (ラベルや値など) は表示されません。
次の例は、HiddenInputAttribute クラスを使用する方法を示しています。
public class ProductViewModel {
[HiddenInput] // equivalent to [HiddenInput(DisplayValue=true)]
public int Id { get; set; }
public string Name { get; set; }
[HiddenInput(DisplayValue=false)]
public byte[] TimeStamp { get; set; }
}
属性が true に設定されている場合 (またはパラメーターが指定されていない場合)、次の処理が行われます。
- 表示テンプレートで、ラベルがレンダリングされ、値がユーザーに表示されます。
- エディター テンプレートで、ラベルがレンダリングされ、値が非表示の入力要素にレンダリングされます。
属性が false に設定されている場合、次の処理が行われます。
- 表示テンプレートで、そのフィールドに対して何もレンダリングされません。
- エディター テンプレートで、ラベルはレンダリングされず、値が非表示の入力要素にレンダリングされます。
Html.ValidationSummary ヘルパー メソッドでモデル レベルのエラーを表示できる
Html.ValidationSummary ヘルパー メソッドには、すべての検証エラーを常に表示するのではなく、モデル レベルのエラーのみを表示する新しいオプションがあります。 これで、モデル レベルのエラーを検証の概要に表示させ、フィールド固有のエラーを各フィールドの横に表示させられるようになります。
Visual Studio の T4 テンプレートが .NET Framework のターゲット バージョンに固有のコードを生成
アプリケーションで使用される .NET Framework のバージョンを指定する新しいプロパティが、ASP.NET MVC T4 ホストの T4 ファイルで使用できるようになりました。 これにより、T4 テンプレートが .NET Framework のバージョンに固有のコードとマークアップを生成できるようになります。 Visual Studio 2008 では、値は常に .NET 3.5 です。 Visual Studio 2010 では、値は .NET 3.5 または .NET 4 のいずれかです。
API の機能強化
このセクションでは、既存の ASP.NET MVC の型とメンバーに対する変更について説明します。
- Controller クラスに、保護された仮想 CreateActionInvoker メソッドを追加しました。 このメソッドは Controller の ActionInvoker プロパティによって呼び出され、呼び出し元がまだ設定されていない場合の呼び出し元の遅延インスタンス化を可能にします。
- AuthorizeAttribute クラスに、保護された仮想 HandleUnauthorizedRequest メソッドを追加しました。 これにより、AuthorizeAttribute から派生するフィルターで、認可が失敗したときの動作を制御できるようになります。
- ValueProviderDictionary クラスに Add (文字列キー、オブジェクト値) メソッドを追加しました これにより、次の例のように、ValueProviderDictionary の辞書初期化子構文を使用できるようになります。
Controller c = new MyController();
c.ValueProvider = new ValueProviderDictionary(null) {
{ "example1", "example1Value" },
{ "example2", "example2Value" },
{ "example3", new int[] { 1, 2, 3 } }
};
- Sys.Mvc.AjaxContext クラスに get_object メソッドを追加しました。 これは get_data メソッドに似た JavaScript メソッドですが、応答のコンテンツ タイプが application/json の場合、get_object は JSON オブジェクトを返します。
- AuthorizationContext クラスに ActionDescriptor プロパティを追加しました。
- フォーム ポストにプロパティがない場合に ID プロパティを含むモデルにバインドするときの問題を回避するために使用できる、UrlParameter.Optional トークンを追加しました。 詳細については、Phil Haack のブログの「ASP.NET MVC 2 の省略可能な URL パラメーター」のエントリを参照してください。
重大な変更
次の変更により、既存の ASP.NET MVC 1.0 アプリケーションでエラーが発生する可能性があります。
IDataErrorInfo を実装するクラスに対するプロパティ検証動作の変更
IDataErrorInfo を使用して検証を実行するモデル オブジェクトの場合、新しい値が設定されたかどうかに関係なく、すべてのプロパティが検証されます。 ASP.NET MVC 1.0 では、新しい値が設定されているプロパティのみが検証されていました。 ASP.NET MVC 2 で、IDataErrorInfo の Error プロパティが呼び出されるのは、すべてのプロパティ検証コントロールが成功した場合のみです。
IIS スクリプト マッピング スクリプトがインストーラで使用できなくなりました
IIS スクリプト マッピング スクリプトは、IIS 6 および IS 7 のスクリプト マップをクラシック モードで構成するために使用されるコマンド ライン スクリプトです。 Visual Studio 開発サーバーを使用する場合、または統合モードで IIS 7 を使用する場合、スクリプト マッピング スクリプトは必要ありません。 スクリプトは、サポートされていない個別のダウンロードとして ASP.NET WebStack で入手できます。
MVC Futures の Html.Substitute ヘルパー メソッドが使用できなくなりました
MVC ビュー エンジンのレンダリング動作が変更されたため、Html.Substitute ヘルパー メソッドは機能しなくなり、また削除されています。
IValueProvider インターフェイスが IDictionary のすべての使用を置き換えます
MVC 1.0 で IDictionary を受け入れていたすべてのプロパティまたはメソッドの引数が、IValueProvider を受け入れるようになりました。 この変更は、カスタム値プロバイダーまたはカスタム モデル バインダーを含むアプリケーションにのみ影響します。 この変更の影響を受けるプロパティとメソッドの例を次に示します。
- ControllerBase および ModelBindingContext クラスの ValueProvider プロパティ。
- Controller クラスの TryUpdateModel メソッド。
Site.css ファイルに新しい CSS クラスが追加されました。
ASP.NET MVC プロジェクト テンプレートの Site.css ファイルが更新され、検証機能とテンプレート化されたヘルパーにより使用される新しいスタイルが含まれるようになりました。
ヘルパーが MvcHtmlString オブジェクトを返すようになりました
ASP.NET 4 の新しい HTML エンコード式構文を利用できるようにする目的で、HTML ヘルパーの戻り値の型が文字列ではなく MvcHtmlString になりました。 ASP.NET MVC 2 と ASP.NET 3.5 の新しいヘルパーを使用する場合、HTML エンコード構文を利用することはできません。新しい構文は、ASP.NET MVC 2 を ASP.NET 4 で実行した場合にのみ使用できます。
JsonResult が HTTP POST 要求に対してのみ応答するようになりました
情報漏えいの可能性がある JSON ハイジャック攻撃を軽減するために、JsonResult クラスが規定で HTTP POST 要求に対してのみ応答するようになりました。 JsonResult オブジェクトを返すアクション メソッドに対する Ajax GET 呼び出しは、代わりに POST を使用するように変更する必要があります。 必要に応じて、JsonResult の新しい JsonRequestBehavior プロパティを設定することで、この動作をオーバーライドできます。 潜在的な悪用の詳細については、Phil Haack のブログの「JSON ハイジャック」のブログ記事を参照してください。
ModelBindingContext の Model および ModelType プロパティ セッターは廃止されました。
ModelBindingContext クラスに、新しい設定可能な ModelMetadata プロパティが追加されました。 新しいプロパティは、Model および ModelType プロパティの両方をカプセル化します。 Model および ModelType プロパティは古い形式ですが、下位互換性の維持のために、プロパティ ゲッターは引き続き機能します (ModelMetadata プロパティにデリゲートして値を取得する形で実行されます)。
DefaultControllerFactory クラスを変更すると、そこから派生するカスタム コントローラー ファクトリが壊れます。
DefaultControllerFactory クラスは、RequestContext プロパティを削除することで修正されました。 このプロパティの代わりに、要求コンテキスト インスタンスが保護された仮想 GetControllerInstance および GetControllerType メソッドに渡されます。 この変更は、DefaultControllerFactory から派生したカスタム コントローラー ファクトリに影響します。
カスタム コントローラー ファクトリは、多くの場合、ASP.NET MVC アプリケーションに依存関係の挿入を提供するために使用されます。 ASP.NET MVC 2 をサポートするようにカスタム コントローラー ファクトリを更新するには、新しいシグネチャに一致するようにメソッド シグネチャを変更し、プロパティの代わりに要求コンテキスト パラメーターを使用します。
"area" は予約済みのルート値キーになりました
ルート値の文字列 "area" が、"controller" や "action" と同じように、ASP.NET MVC で特別な意味を持つようになりました。 影響のひとつとして、HTML ヘルパーに "area" を含むルート値辞書が指定されている場合、そのヘルパーはクエリ文字列に "area" を追加しなくなります。
Areas 機能を使用している場合、ルート URL の一部として {area} を使用しないようにしてください。
免責情報
このドキュメントは暫定版であり、ここで説明するソフトウェアの最終的な商業リリースより前に大幅に変更される可能性があります。
このドキュメントに含まれる情報は、取り上げている問題についての、公開時点における Microsoft Corporation の見解を表します。 Microsoft は変化する市場状況に対応する必要があるため、これを Microsoft による確約と解釈しないでください。Microsoft は、記載されている情報の公開後の正確さを保証できません。
このホワイト ペーパーは、情報提供のみを目的としています。 明示、黙示または法律の規定にかかわらず、これらの情報について Microsoft はいかなる責任も負わないものとします。
お客様ご自身の責任において、適用されるすべての著作権関連法規に従ったご使用をお願いします。 このドキュメントのいかなる部分も、米国 Microsoft Corporation の書面による許諾を受けることなく、検索システムに複製、格納、導入したり、その目的を問わず、いかなる形態や手段であっても、転送することは禁じられています。ここでいう手段とは、電子的、機械的、複写、録音など、すべての手段を含みます。ただしこれは、著作権法上のお客様の権利を制限するものではありません。
Microsoft は、このドキュメントに記載されている内容に関して、特許、特許申請、商標、著作権、またはその他の知的財産権を有する場合があります。 Microsoft による使用許諾契約書によって明示的に許可されている場合を除き、このドキュメントの提供によって、これらの特許権、商標、著作権、またはその他の知的財産権のライセンスが貴社に供与されることはありません。
別途記載されていない場合、このソフトウェアおよび関連するドキュメントで使用している会社、組織、製品、ドメイン名、メール アドレス、ロゴ、人物、場所、出来事などの名称は架空のものであり、実在する会社、組織、商品名、ドメイン名、メール アドレス、ロゴ、個人、場所、イベントなどとは一切関係ありません。
© 2010 Microsoft Corporation. All rights reserved.
Microsoft および Windows は、米国および他の国における Microsoft Corporation の登録商標または商標です。
本ドキュメントで説明する実際の製造元および製品名は、それぞれの所有者の商標である場合があります。