Не чувствуя 100% о моей конструкции регулятора.


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

using System.Data;
using System.Data.OleDb;
using System.Web;
using System.Web.Mvc;
using QuimizaReportes.Models;
using System.Collections.Generic;
using System;

namespace QuimizaReportes.Controllers
{
    public class UploadController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }

        [HttpPost]
        public ActionResult Index(HttpPostedFileBase excelFile)
        {
            if (excelFile != null)
            {
                //Save the uploaded file to the disc.
                string savedFileName = "~/UploadedExcelDocuments/" + excelFile.FileName;
                excelFile.SaveAs(Server.MapPath(savedFileName));

                //Create a connection string to access the Excel file using the ACE provider.
                //This is for Excel 2007. 2003 uses an older driver.
                var connectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=Excel 12.0;", Server.MapPath(savedFileName));

                //Fill the dataset with information from the Hoja1 worksheet.
                var adapter = new OleDbDataAdapter("SELECT * FROM [Hoja1$]", connectionString);
                var ds = new DataSet();
                adapter.Fill(ds, "results");
                DataTable data = ds.Tables["results"];

                var people = new List<Person>();

                for (int i = 0; i < data.Rows.Count - 1; i++)
                {
                    Person newPerson = new Person();
                    newPerson.Id = data.Rows[i].Field<double?>("Id");
                    newPerson.Name = data.Rows[i].Field<string>("Name");
                    newPerson.LastName = data.Rows[i].Field<string>("LastName");
                    newPerson.DateOfBirth = data.Rows[i].Field<DateTime?>("DateOfBirth");

                    people.Add(newPerson);
                }

                return View("UploadComplete", people);
            }

            return RedirectToAction("Error", "Upload");                      
        }

        public ActionResult Error()
        {
            return View();
        }
    }
}

Не чувствую себя так уверенно это лучший подход. Любое предложение любой из вас MVC3 ветеринары за этот честолюбивый старший программист? :)



719
5
задан 25 февраля 2011 в 02:02 Источник Поделиться
Комментарии
1 ответ

Логика для считывания Excel-файла (т. е. все, от ВАР параметр connectionString , пока до возвращения) принадлежит в модели метод, а не контроллер.

Можно также обрабатывать случаи, когда загруженный файл не является файлом Excel или она не имеет столбцы, которые вы ожидаете. В зависимости от того, как вы используете эту, или того, кто его использует, это может не потребоваться, но если обычные пользователи могут загружать файлы, они могут очень хорошо загрузить не тот файл, даже если ты им не. И в этом случае осмысленное сообщение об ошибке приводит к лучшего пользовательского опыта.

Что касается вопроса в вашем комментарии: как я уже сказал, Я не знаю, как это будет использоваться, но я не могу придумать ситуации, где это будет полезно для пользователей, чтобы быть в состоянии повторно загрузить файл, нажав кнопку Обновить. Так что да, перенаправление на UploadComplete действие имеет смысл.

9
ответ дан 25 февраля 2011 в 10:02 Источник Поделиться