Как создать представление / модель представления FileUpload, которое не является сущностью в базе данных - PullRequest
0 голосов
/ 08 июня 2018

Я работаю над приложением аукциона и создаю метод, чтобы администраторы могли представить таблицу Excel, которая создаст новый аукцион и сохранит его в базе данных.Итак, сначала я создал класс (модель) Uploadfile следующим образом:

[NotMapped]
public class UploadFile
{
    [Required]
    public HttpPostedFileBase ExcelFile { get; set; }
}

Я использовал NotMapped, потому что я пытаюсь понять, как создавать и использовать модели, которые не хранятся в моей базе данных, иВ этом моя проблема и недоразумение.

Я создал контроллер, который я сделал вручную, поскольку UploadFile не является сущностью с ключом как таковым:

public class FileUploadsController : Controller
{
    private AuctionEntities db = new AuctionEntities();

    // GET: FileUploads
    public ActionResult Index()
    {
        UploadFile UploadFile = new UploadFile();
        return View(UploadFile);
    }

    [HttpPost]
    public ActionResult Index(UploadFile UploadFile)
    {
        if (ModelState.IsValid)
        {
            if (UploadFile.ExcelFile.ContentLength > 0)
            {
                if (UploadFile.ExcelFile.FileName.EndsWith(".xlsx") || UploadFile.ExcelFile.FileName.EndsWith(".xls"))
                {
                    XLWorkbook wb;

                    // in case if the file is corrupt
                    try
                    {
                        wb = new XLWorkbook(UploadFile.ExcelFile.InputStream);
                    }
                    catch (Exception ex)
                    {
                        ModelState.AddModelError(String.Empty, $"Check your file. {ex.Message}");
                        return View();
                    }

                    IXLWorksheet ws = null;

                    try   // in case the sheet you are looking for is not found
                    {
                        ws = wb.Worksheet("sheet1");
                    }
                    catch
                    {
                        ModelState.AddModelError(String.Empty, "Sheet not found");
                        return View();
                    }

                    var firstRowUsed = ws.FirstRowUsed();
                    var auctionRow = firstRowUsed.RowUsed().RowBelow();

                    // create auction
                    string auctionName = auctionRow.Cell(1).Value.ToString();
                    DateTimeOffset startDate = DateTimeOffset.Parse(auctionRow.Cell(2).Value.ToString());
                    DateTimeOffset endDate = DateTimeOffset.Parse(auctionRow.Cell(3).Value.ToString());
                    string folderName = auctionRow.Cell(4).Value.ToString();

                    Models.Auction auction = new Models.Auction(auctionName, startDate, endDate, folderName);
                    db.Auctions.Add(auction);

                    // find the next table
                    var nextRow = auctionRow.RowBelow();

                    while (nextRow.IsEmpty())
                    {
                        nextRow = nextRow.RowBelow();
                    }

                    const int catNameCol = 1;
                    var catRow = nextRow.RowUsed().RowBelow();

                    // get categories from ws table and add to the auction
                    while (!catRow.Cell(catNameCol).IsEmpty())
                    {
                        string catName = catRow.Cell(1).Value.ToString();
                        int seqNo = Convert.ToInt32(catRow.Cell(2).Value.ToString());
                        string fileName = catRow.Cell(3).Value.ToString();

                        Cat cat = new Cat(auction.AuctionId, catName, seqNo, fileName);
                        auction.Cats.Add(cat);

                        catRow = catRow.RowBelow();
                    }

                    var findNextRow = catRow.RowBelow();

                    while (findNextRow.IsEmpty())
                    {
                        findNextRow = findNextRow.RowBelow();
                    }

                    const int itemNameCol = 1;

                    var itemRow = findNextRow.RowUsed().RowBelow();

                    while(!itemRow.Cell(itemNameCol).IsEmpty())
                    {
                        string itemName = itemRow.Cell(1).Value.ToString();
                        string itemDesc = itemRow.Cell(2).Value.ToString();
                        string catName = itemRow.Cell(3).Value.ToString();
                        string modelNo = itemRow.Cell(4).Value.ToString();
                        decimal retailValue = Convert.ToDecimal(itemRow.Cell(5).Value.ToString());
                        string fileName = itemRow.Cell(6).Value.ToString();
                        decimal initialBid = Convert.ToDecimal(itemRow.Cell(7).Value.ToString());
                        decimal increment = Convert.ToDecimal(itemRow.Cell(8).Value.ToString());
                        Cat itemCat = null;

                        foreach(var cat in auction.Cats)
                        {
                            if(catName == cat.CatName)
                            {
                                itemCat = cat;
                            }
                        }

                        Item item = new Item(itemName, itemDesc, modelNo, retailValue, fileName, startDate, endDate, initialBid, increment, null, null, null, itemCat);
                        itemCat.Items.Add(item);

                        itemRow = itemRow.RowBelow();
                    }
                }
                else
                {
                    ModelState.AddModelError(String.Empty, "Only .xlsx and .xls files are allowed");
                    return View();
                }
            }
            else
            {
                ModelState.AddModelError(String.Empty, "Not a valid file");
                return View();
            }
        }

        db.SaveChanges();

        return View();
    }

Затем я подумал, что попытаюсь снова создать представление, такчто я могу показать, куда пользователь загружает файл, и посмотреть, работает ли мой метод, и именно здесь я столкнулся с недостатком знаний в asp.net.

Поэтому я попытался создать ViewModel, как я видел, так как модель, которую я создал ранее, была моделью данных, поэтому я мог использовать эту модель для отображения загрузки на моей странице просмотра.Моя ViewModel проста:

public class FileUploadViewModel
{
    public HttpPostedFileBase ExcelFile { get; set; }
}

Теперь я хотел создать страницу представления для этой модели представления, и она все еще рассматривает эту модель как объект и выдает ошибку, что у него нет ключа.и т.д. Мне нужна страница просмотра, которая может получить доступ к модели с файлом Excel, и я не могу понять, как этого добиться.Я читал о моделях представления и знаю, насколько они важны в MVC, однако я просто не могу понять, как их использовать.Может кто-нибудь, пожалуйста, помогите мне понять, как использовать один здесь?

По сути, я хочу использовать эту страницу просмотра с моей моделью или моделью представления:

1 Ответ

0 голосов
/ 08 июня 2018

Мое обоснованное предположение состоит в том, что вы застреваете в окне «Добавить представление».

Вы, вероятно, выбираете шаблон, для которого требуется модель (например, Create), выбирая класс FileUploadViewModel в качествемодель и ваш контекст.

Это приводит к тому, что «мастер» Visual Studio пытается внутренне сопоставить модель с вашим контекстом, что приводит к появившейся ошибке.

Вместо этого выберите Empty (without model) в качестве шаблона, который будет затенять поля Model и Data Context.Ваш вид будет создан без ошибок.

Затем вы можете указать представлению, что вы ожидаете вашу модель, добавив это вверху:

@model FileUploadViewModel

Убедитесь, что вы полностью соответствуете FileUploadViewModel (например, включите пространство имен впереди).

Теперь ваши методы должны использовать модель, указанную в верхней части представления:

public ActionResult Index()
{
    FileUploadViewModel UploadFile = new FileUploadViewModel();
    return View(UploadFile);
}

[HttpPost]
public ActionResult Index(FileUploadViewModel UploadFile)
{

}

Вам не нужен атрибут [NotMapped] где-либо здесь.

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