System.ArgumentNullException: 'Значение не может быть нулевым ошибкой - PullRequest
0 голосов
/ 30 мая 2020

Я очень новичок в MVC, и я пытаюсь создать форму для ввода файла загрузки, которая позволяет пользователю загружать файл, он читает содержимое и отображает его в таблице. но я продолжаю получать эту ошибку. Строка, которая дает мне эту ошибку, на мой взгляд, является строкой if Model.Count, и я не уверен, как ее исправить.

Вот мой код:

Контроллер:

      public ActionResult Index()
    {
        return View(new List<CategoryModel>());
    }

    [HttpPost]
    public ActionResult Index(HttpPostedFileBase postedFile)
    {
        List<CategoryModel> categories = new List<CategoryModel>();
        string filePath = string.Empty;
        if (postedFile != null)
        {
            string path = Server.MapPath("~/Uploads/");
            if (!Directory.Exists(path))
            {
                Directory.CreateDirectory(path);
            }

            filePath = path + Path.GetFileName(postedFile.FileName);
            string extension = Path.GetExtension(postedFile.FileName);
            postedFile.SaveAs(filePath);

            //Read the contents of CSV file.
            string csvData = System.IO.File.ReadAllText(filePath);


            //Execute a loop over the rows.
            foreach (string row in csvData.Split('\n'))
            {
                if (!string.IsNullOrEmpty(row))
                {
                    categories.Add(new CategoryModel
                    {
                        CategoryID = Convert.ToInt32(row.Split(',')[0]),
                        Name = row.Split(',')[1],
                        Item = row.Split(',')[2]
                    });
                }
            }
        }

        return View();
    }
}

}

И модель:

{
public class CategoryModel
{
    public int CategoryID { get; set; }
    public string Name { get; set; }   
    public string Item { get; set; }
}

И вид:

 @{
    ViewBag.Title = "View";
}

<h2>View</h2>

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    @using (Html.BeginForm("Index", "Home", FormMethod.Post, new { enctype = "multipart/form-data" }))
    {
        <span>Select File:</span>
        <input type="file" name="postedFile" />
        <hr />
        <input type="submit" value="Upload" />
    }
    @if (Model.Count() > 0)
    {
        <hr />
        <table cellpadding="0" cellspacing="0">
            <tr>
                <th>CategoryID</th>
                <th>Name</th>
                <th>Item</th>
            </tr>
            @foreach (CategoryModel category in Model)
            {
                <tr>
                    <td>@category.CategoryID</td>
                    <td>@category.Name</td>
                    <td>@category.Item</td>
                </tr>
            }
        </table>
    }
</body>
</html>

1 Ответ

0 голосов
/ 30 мая 2020

Когда вы делаете это в своем действии контроллера:

return View();

Вы не передаете модель в представление, поэтому Model в представлении - это null. Когда вы пытаетесь вызвать методы расширения (например, .Count()) по ссылке null, вы получаете эту ошибку. (Поскольку технически это не NullReferenceException, а скорее метод расширения, проверяющий, является ли первый аргумент null, и выдает исключение.)

Вам нужно будет либо проверить null в вашем представлении , или всегда передавайте экземпляр модели. Как и в первом действии контроллера:

return View(new List<CategoryModel>());

Кстати, после успешного действия POST обычно обычно перенаправляют пользователя, а не возвращают представление. Таким образом, браузер отправляет новый HTTP-запрос GET для перенаправления, поэтому, если пользователь перезагружает страницу, он не выполняет повторную отправку формы, а просто перезагружает GET.

Итак, вместо этого:

return View();

Вы можете сделать это:

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