ArgumentNullException:值不能为null。参数名称:viewData

时间:2018-04-19 09:17:02

标签: razor asp.net-core-mvc

我有这样简单的登录页面:

Login.cshtml

@page
@model GDPR.Views.Account.LoginModel
@{
}

@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers


<html>
<body>
    <p>Login </p>
    <form method="post">
        <div asp-validation-summary="All"></div>
        Username: <input asp-for="loginData.Username" value="username" /><br />
        Password: <input asp-for="loginData.Password" value="password" /><br />
        <br />
        <input type="submit" value="Login" />
        @Html.AntiForgeryToken()
    </form>
</body>
</html>

和代码背后:

public class LoginModel : PageModel
{
    [BindProperty] // Bind on Post
    public LoginData loginData { get; set; }

    public async Task<IActionResult> OnPostAsync()
    {
        if (ModelState.IsValid)
        {
          .......
            await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, principal);
            return RedirectToPage("/Home/Index");
        }
        else
        {
            ModelState.AddModelError("", "username or password is blank");
            return Page();
        }
    }


    public class LoginData
    {
        [Required]
        public string Username { get; set; }

        [Required, DataType(DataType.Password)]
        public string Password { get; set; }
    }
}

当我运行应用程序时,我收到一个错误:ArgumentNullException值不能为null,param name:viewData。

enter image description here

出现这种错误的原因是什么?

6 个答案:

答案 0 :(得分:1)

它可能为null,因为视图模型的名称空间尚未添加到_viewImports。

将命名空间添加到_viewImports,以便应用程序可以使用剃刀页面后面的模型。

希望这有帮助。

这里有关于Razor页面的一些信息:

https://docs.microsoft.com/en-us/aspnet/core/mvc/razor-pages/?view=aspnetcore-2.1&tabs=visual-studio

答案 1 :(得分:0)

尝试将asp-for="loginData.Username"更改为asp-for="Model.loginData.Username"

答案 2 :(得分:0)

第一行的@page为空,这是导致错误的原因。删除@page语句或使用它来定义要显示的页面。

答案 3 :(得分:0)

在页面顶部查看并删除指令@ Page,@ page期望一个请求,该请求会使页面像MVC一样起作用。这是一个很好的教程。 https://docs.microsoft.com/en-us/aspnet/core/razor-pages/?view=aspnetcore-2.2&tabs=visual-studio

答案 4 :(得分:0)

从文件中删除@page不会引发任何错误,但是,如果从Controller渲染PageModel,则PageModel不会正确初始化。您的“获取”和“发布”功能也不会触发。

为您的PageModels创建一个单独的文件夹

/Pages ..../Login.cshtml ..../Logoin.cshtml.cs

答案 5 :(得分:0)

根据您的代码描述,我可以说您正在使用 .Net Core MVC 并且您正在尝试执行您的登录页面。

@page 指令是正确的,没有问题。似乎您没有正确配置您的 Startup.cs。试试下面的代码:

对于 ASP .Net Core 3.1

public void ConfigureServices(IServiceCollection services)
    {
        services.AddRazorPages();
    }

并在配置中:

app.UseEndpoints(endpoints =>
        {
            endpoints.MapRazorPages();
        });

它看起来像:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();

        app.UseRouting();

        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapRazorPages();
        });
    }

对于 ASP .Net Core 2.2

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        // Includes support for Razor Pages and controllers.
        services.AddMvc();
    }

    public void Configure(IApplicationBuilder app)
    {
        app.UseMvc();
    }
}

执行你的代码,应该没有错误。