Как управлять NullReferenceException? - PullRequest
0 голосов
/ 22 апреля 2020

Я хочу сделать форму, которую пользователь должен заполнить. Но я получаю сообщение об ошибке.

Модель:

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 - ссылка на объект не установлена ​​на экземпляр объекта ... который может помочь мне справиться с этой ошибкой. Покажите мне, где моя ошибка, пожалуйста

Ответы [ 2 ]

3 голосов
/ 22 апреля 2020

Я думаю, вам нужно go снова просмотреть учебники в документации. Не похоже, что вы действительно знаете, что делаете здесь. У вас есть поле с именем Input, которое, похоже, извлекается со страницы Razor, но вы работаете здесь с контроллером MVC. Однако даже это не так, потому что вы обычно видите это как-то вроде:

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

На странице бритвы. Здесь это даже не свойство, поэтому, даже если бы это обычно делало что-то, оно не было бы как поле, независимо от того.

NullReferenceException приходит, потому что вы ссылаетесь на это поле, но никогда не инициализируете его. Опять же, на странице Razor (и если бы это было свойство, а не поле), это было бы заполнено данными поста (через BindProperty), но в контроллере это не работает.

В вашем действии контроллера у вас есть userReport параметр, поэтому , что - это то, где данные поста будут go. Однако, поскольку все атрибуты asp-for в вашем представлении ссылаются на Input.Something, на самом деле ничто не будет связано с этим параметром. Похоже, что это тоже извлекается со страницы Razor, не считая, что это работает только на странице Razor.

Длинно и коротко, похоже, что вы просто скопировали код из других мест, фактически не понимая это или то, что он делает, и превратил его в контроллер и просмотр. Все это в корне сломано сверху вниз.

0 голосов
/ 23 апреля 2020

Вы смешали с MVC и Razor Pages.

Для MVC:

1.Модель:

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.cs html:

@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. Контроллер:

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);
    }
}

Для страниц бритвы:

1.Модель:

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.cs html:

@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.cs html .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");
    }
}

Ссылка:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...