不同的对象到同一个webgrid控件

时间:2012-02-29 17:27:21

标签: asp.net-mvc webgrid

我有一个可从下拉列表中选择的csv文件列表。每个csv的数据是不同的。我正在拉入csv文件,并希望使用相同的webgrid显示数据。我是否会将动态对象传递给webgrid,因此webgrid可以显示所有csv数据的列和值?如果

1 个答案:

答案 0 :(得分:0)

是的,您可以使用动态视图模型:

public class MyViewModel
{
    public string SelectedCsv { get; set; }
    public IEnumerable<SelectListItem> AvailableCsv {
        get
        {
            return new[]
            {
                new SelectListItem { Value = "foo.csv", Text = "foo.csv" },
                new SelectListItem { Value = "bar.csv", Text = "bar.csv" },
                new SelectListItem { Value = "baz.csv", Text = "baz.csv" },
            };
        }
    }

    public IEnumerable<object> Data { get; set; }
}

然后有一个控制器:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var model = new MyViewModel
        {
            Data = GetData("foo.csv"),
        };
        return View(model);
    }

    [HttpPost]
    public ActionResult Index(MyViewModel model)
    {
        model.Data = GetData(model.SelectedCsv);
        return View(model);
    }

    // TODO: move this method away in a repository and
    // do the actual parsing of the CSV file
    private IEnumerable<object> GetData(string csv)
    {
        if (csv == "foo.csv")
        {
            return new[] 
            { 
                new { col1 = "value1", col2 = "value2" },
                new { col1 = "value1", col2 = "value2" },
            };
        }
        else if (csv == "bar.csv")
        {
            return new[] 
            { 
                new { col1 = "bar value1", col2 = "bar value2", col3 = "bar value3" },
            };
        }
        else if (csv == "baz.csv")
        {
            return new[] 
            { 
                new { col1 = "baz value1" },
                new { col1 = "baz value2" },
                new { col1 = "baz value3" },
            };
        }

        throw new NotImplementedException();
    }
}

并在视图中:

@model MyViewModel

@using (Html.BeginForm())
{
    @Html.DropDownListFor(x => x.SelectedCsv, Model.AvailableCsv)
    <button type="submit">OK</button>
}

@{
    var grid = new WebGrid(Model.Data);
}

@grid.GetHtml()

就CSV文件的解析而言,如果只有从不那么一件事,那就是roll your own CSV parser