对我的控制器设计没有100%的感觉

时间:2011-02-25 13:09:23

标签: c# asp.net-mvc-3 controller

基本上,我正在上传一个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兽医的建议吗? :)

我应该调用另一个Action,“UploadComplete”并调用UploadComplete视图,而不是直接从[POST] Index操作调用View吗?我何时知道是使用一种方法还是另一种方法?

2 个答案:

答案 0 :(得分:0)

我认为Post-Redirect-Get模式在这里完全适用。例如,您可以使用TempData传递“人员”数据。

答案 1 :(得分:0)

我可能会将Index操作中的代码简化为保存文件,并重定向到另一个操作,该操作负责从文件中读取数据并显示它。

可以使用路径值的第三个参数调用RedirectToAction,该参数可以标识要读取的文件。