如何管理 NullReferenceException?

How to manage NullReferenceException?

我想制作一个用户必须填写的表格。 但是我遇到了一个错误。

型号:

public UserReport Input;

[Key]
//[Required]
public string ReportID { get; set; }


[Required]
public string Description { get; set; }

[Required]
[DataType(DataType.DateTime)]
public string Date { get; set; }

控制器:

private ApplicationDbContext _userReport;
public UserReport Input;

public PageController(ApplicationDbContext userReport)
{
    _userReport = userReport;
}

[HttpGet]
public IActionResult SendReport()
{
    return View();
}

[Authorize]
[HttpPost]
public async Task<IActionResult> SendReport(UserReport userReport)
{
    var user = new UserReport { Description = Input.Description, Date = Input.Date };
    var r = await _userReport.AddAsync(user);
}

查看:

@model UserReport
<div class="col-md-6">
    <form id = "SendReport" method="post">
        <div asp-validation-summary="All" class="text-danger"></div>

        <div class="form-group">
            <label asp-for="Input.Description"></label>
            <input asp-for="Input.Description" class="form-control" />
            <span asp-validation-for="Input.Description" class="text-danger"></span>
        </div>

        <div class="form-group">
            <label asp-for="Input.Date"></label>
            <input asp-for="Input.Date" class="form-control" />
            <span asp-validation-for="Input.Date" class="text-danger"></span>
        </div>


        <button type = "submit" class="btn btn-primary">send report</button>
    </form>
</div>

这有什么问题? 它向我显示了这个错误:System.NullReferenceException - 对象引用未设置为对象的实例...谁可以帮助我处理此错误。 请告诉我我的错误在哪里

我认为您需要重新阅读文档中的教程。看来你真的不知道自己在这里做什么。您有一个名为 Input 的字段,它似乎是从 Razor 页面中提取的,但您在这里使用的是 MVC 控制器。但是,即使这样也已关闭,因为您通常会将其视为:

[BindProperty]
public UserReport Input { get; set; }

在 Razor 页面中。在这里,它甚至不是 属性,所以即使它通常会做某事,它也不会作为一个字段,无论如何。

NullReferenceException 出现是因为您引用了该字段,但从未实际初始化它。同样,在 Razor 页面中(如果它是 属性 而不是字段),这将填充 post 数据(通过 BindProperty),但它不起作用在控制器中就是这样。

在您的控制器操作中,您有一个 userReport 参数,因此 是 post 数据的去向。但是,由于您视图中的所有 asp-for 属性都引用 Input.Something,因此实际上没有任何内容绑定到此参数。这似乎也是从 Razor 页面中提取的,没有考虑到它只能在 Razor 页面中以这种方式工作。

总而言之,您似乎只是从其他地方复制代码,而没有真正理解其中的任何内容或它的作用,然后将其拼凑成一个控制器和视图。整个事情从根本上是自上而下的。

您混合使用了 MVC 和 Razor Pages。

对于 MVC:

1.Model:

public class UserReport
{
    [Key]
    //[Required]
    public string ReportID { get; set; }

    [Required]
    public string Description { get; set; }

    [Required]
    [DataType(DataType.DateTime)]
    public string Date { get; set; }
}

2.SendReport.cshtml:

@model UserReport
<div class="col-md-6">
    <form asp-action="SendReport" method="post">
        <div asp-validation-summary="All" class="text-danger"></div>

        <div class="form-group">
            <label asp-for="Description"></label>
            <input asp-for="Description" class="form-control" />
            <span asp-validation-for="Description" class="text-danger"></span>
        </div>

        <div class="form-group">
            <label asp-for="Date"></label>
            <input asp-for="Date" class="form-control" />
            <span asp-validation-for="Date" class="text-danger"></span>
        </div>


        <button type="submit" class="btn btn-primary">send report</button>
    </form>
</div>

3.Controller:

public class UserReportsController : Controller
{
    private readonly YourDbContext _context;

    public UserReportsController(YourDbContext context)
    {
        _context = context;
    }
    public IActionResult SendReport()
    {
        return View();
    }

    [HttpPost]
    public async Task<IActionResult> SendReport([Bind("ReportID,Description,Date")] UserReport userReport)
    {
        if (ModelState.IsValid)
        {
            _context.Add(userReport);
            await _context.SaveChangesAsync();
            return RedirectToAction(nameof(Index));
        }
        return View(userReport);
    }
}

对于 Razor 页面:

1.Model:

public class UserReport
{
    [Key]
    //[Required]
    public string ReportID { get; set; }


    [Required]
    public string Description { get; set; }

    [Required]
    [DataType(DataType.DateTime)]
    public string Date { get; set; }
}

2.SendReport.cshtml:

@page
@model SendReportModel

<div class="col-md-6">
    <form id="SendReport" method="post">
        <div asp-validation-summary="All" class="text-danger"></div>

        <div class="form-group">
            <label asp-for="Input.Description"></label>
            <input asp-for="Input.Description" class="form-control" />
            <span asp-validation-for="Input.Description" class="text-danger"></span>
        </div>

        <div class="form-group">
            <label asp-for="Input.Date"></label>
            <input asp-for="Input.Date" class="form-control" />
            <span asp-validation-for="Input.Date" class="text-danger"></span>
        </div>


        <button type="submit" class="btn btn-primary">send report</button>
    </form>
</div>

3.SendReport.cshtml.cs:

public class SendReportModel : PageModel
{
    private readonly YourDbContext _context;

    public SendReportModel(YourDbContext context)
    {
        _context = context;
    }

    public IActionResult OnGet()
    {
        return Page();
    }

    [BindProperty]
    public UserReport Input { get; set; }

    public async Task<IActionResult> OnPostAsync()
    {
        if (!ModelState.IsValid)
        {
            return Page();
        }

        _context.UserReport.Add(Input);
        await _context.SaveChangesAsync();

        return RedirectToPage("./Index");
    }
}

参考: