質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Null

Nullとは、プログラミング言語やデータベースにおけるデータ表現の一種です。コンテキストによって"空"もしくは"長さ0の文字列"、”未知・不明”を意味します。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

Q&A

解決済

1回答

1794閲覧

ログインページをスタートページにするとNullReferenceExceptionエラーが表示される。

Mk-ky

総合スコア19

Null

Nullとは、プログラミング言語やデータベースにおけるデータ表現の一種です。コンテキストによって"空"もしくは"長さ0の文字列"、”未知・不明”を意味します。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

0グッド

0クリップ

投稿2021/07/05 04:47

編集2021/07/06 08:42

前提

.NET5を利用してログインページを作成しました。
そこでログインページを一番最初に表示するためにHomeControllerにアクションを作成し、startup.csを書き換えた(下記)のですがそうするとエラーが表示されました。

発生している問題・エラーメッセージ

6行目にNullReferenceExceptionエラーが表示されます。

System.NullReferenceException: 'Object reference not set to an instance of an object.'

Controller

C#

1using Microsoft.AspNetCore.Mvc; 2using Microsoft.Extensions.Logging; 3using System; 4using System.Collections.Generic; 5using System.Diagnostics; 6using System.Linq; 7using System.Threading.Tasks; 8using プロジェクト.Models; 9 10namespace プロジェクト.Controllers 11{ 12 public class HomeController : Controller 13 { 14 private readonly ILogger<HomeController> _logger; 15 16 public HomeController(ILogger<HomeController> logger) 17 { 18 _logger = logger; 19 } 20 21 public IActionResult Index() 22 { 23 return View(); 24 } 25 26 public IActionResult Privacy() 27 { 28 return View(); 29 } 30 31    //ここから追加 32 public IActionResult Login() 33 { 34 return View("Areas/Identity/Pages/Account/Login.cshtml"); 35 } 36    //ここまで 37 38 [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] 39 public IActionResult Error() 40 { 41 return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier }); 42 } 43 } 44}

書き換えたStartup

C#

1using Microsoft.AspNetCore.Builder; 2using Microsoft.AspNetCore.Hosting; 3using Microsoft.AspNetCore.HttpsPolicy; 4using Microsoft.AspNetCore.Identity; 5using Microsoft.AspNetCore.Identity.UI; 6using Microsoft.EntityFrameworkCore; 7using Microsoft.Extensions.Configuration; 8using Microsoft.Extensions.DependencyInjection; 9using Microsoft.Extensions.Hosting; 10using System; 11using System.Collections.Generic; 12using System.Linq; 13using System.Threading.Tasks; 14using プロジェクト.Data; 15 16namespace プロジェクト 17{ 18 public class Startup 19 { 20 public Startup(IConfiguration configuration) 21 { 22 Configuration = configuration; 23 } 24 25 public IConfiguration Configuration { get; } 26 27 // This method gets called by the runtime. Use this method to add services to the container. 28 public void ConfigureServices(IServiceCollection services) 29 { 30 services.AddRazorPages(); 31 32 services.AddDbContext<ApplicationDbContext>(options => 33 options.UseSqlServer( 34 Configuration.GetConnectionString("DefaultConnection"))); 35 services.AddDatabaseDeveloperPageExceptionFilter(); 36 37 services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true) 38 .AddEntityFrameworkStores<ApplicationDbContext>(); 39 services.AddControllersWithViews(); 40 } 41 42 // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. 43 public void Configure(IApplicationBuilder app, IWebHostEnvironment env) 44 { 45 if (env.IsDevelopment()) 46 { 47 app.UseDeveloperExceptionPage(); 48 app.UseMigrationsEndPoint(); 49 } 50 else 51 { 52 app.UseExceptionHandler("/Home/Error"); 53 // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. 54 app.UseHsts(); 55 } 56 app.UseHttpsRedirection(); 57 app.UseStaticFiles(); 58 59 app.UseRouting(); 60 61 app.UseAuthentication(); 62 app.UseAuthorization(); 63 64 app.UseEndpoints(endpoints => 65 { 66 endpoints.MapRazorPages(); 67 endpoints.MapControllerRoute( 68 name: "default", 69 pattern: "{controller=Home}/{action=Login}/{id?}"); //ここを書き換えた  70 /* 71 書き換え前は 72          pattern: "{controller=Home}/{action=Index}/{id?}"); 73 */ 74 75 }); 76 } 77 } 78}

Login.cshtml

Razor

1@page 2 3@model LoginModel 4 5@{ 6 ViewData["Title"] = "ログイン"; //@*ここにNullReferenceException: Object reference not set to an instance of an object.が表示されます*@ 7} 8 9<h1> ログイン </h1>  10<div class="row"> 11 <div class="col-md-4"> 12 <section> 13 <form id="account" method="post"> 14 <h4>端末IDを入力してログインします</h4> 15 <hr /> 16 <div class="form-group"> 17 <label asp-for="Input.Email">ID</label> 18 <input asp-for="Input.Email" class="form-control" /> 19 <span 9="Input.Email" class="text-danger"></span> 20 </div> 21 <div class="form-group"> 22 <label asp-for="Input.Password">パスワード</label> 23 <input asp-for="Input.Password" class="form-control" /> 24 <span asp-validation-for="Input.Password" class="text-danger"></span> 25 </div> 26 <div class="form-group"> 27 <div class="checkbox"> 28 <label asp-for="Input.RememberMe"> 29 30 <input asp-for="Input.RememberMe" /> 31 @Html.DisplayNameFor(m => m.Input.RememberMe) 32 33 </label> 34 </div> 35 </div> 36 <div class="form-group"> 37 <button type="submit" class="btn btn-primary">Log in</button> 38 </div>

試したこと

@pageディレクティブを削除するとエラーは出なくなりました。ですがログインボタンを押してもページが遷移しなくなりました。

ViewData["Title"] = "ログイン"; をコメントアウトすると17行目の <label asp-for="Input.Email">端末ID</label> に System.ArgumentNullException: 'Value cannot be null. Arg_ParamName_Name'というエラーが表示されます。

補足情報

VS2019のテンプレートはRazorの認証に「個別のアカウント」を使ってプロジェクトを生成し、Loginページをスキャフォールディング機能を使って作成しました。

Microsoft Visual Studio Community 2019 Version 16.9.4
.NET5 MVC

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/07/05 06:03

> .NET5を利用してログインページを作成しました。 使った VS2019 のテンプレートは何ですか? MVC か Razor で認証に「個別のカウント」を使ってプロジェクトを生成し、Login ページをスキャフォールディング機能を使って RCL をオーバーライドしたということでしょうか? (質問者さんの独自実装ではなさそうに見えますが、独自実装だとすると話はできないので聞いてます) > そこでログインページを一番最初に表示するためにstartup.csを書き換えたのですが 具体的にどのようにしたのか書いてください。 以上の情報は質問欄を編集して追記願います。ここは「質問への追記・修正の依頼」の場所で、しかも初期画面では閉じていますので読まない人がいますから。
guest

回答1

0

ベストアンサー

そこでログインページを一番最初に表示するためにHomeControllerにアクションを作成し、startup.csを書き換えた

「ログインページを一番最初に表示する」という目的なら、Controller に AuthorizeAttribute 属性を付与しておけば、匿名ユーザーがその Controller にアクセスしてきた時には Login ページへリダイレクトされるので、目的は果たせると思うのですが。(ASP.NET の認証はもともとそういう仕組みです)

イメージ説明

わざわざ Controller と Startup.cs に質問に書いてあるような細工をしたということは、他にも目的があるのですかね。

投稿2021/07/05 08:04

編集2021/07/05 08:05
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Mk-ky

2021/07/05 08:52

ありがとうございます! 想定通りに動きました。 他に目的はなくその仕様を知りませんでした。 そのためずっとViewDataがnullになる理由などをずっと探していました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問