在VIew上的mvc3中有多个IEnumerable工具

Ami*_*mit 1 asp.net-mvc asp.net-mvc-3 asp.net-mvc-4 mvcgrid

@{IEnumerable<BC.Models.APPLICATION> data = ViewBag.list;} 
@Html.Grid(data).Columns(columns =>
{
columns.Add(c => c.APPLICATION_NO).Titled("Application No").Filterable(true);
})
Run Code Online (Sandbox Code Playgroud)

但我想做那样的事情:

@if(some conditon)
{
@{IEnumerable<BC.Models.APPLICATION> data = ViewBag.list;} 
}
else
{
@{IEnumerable<BC.Models.RIGHTS> data = ViewBag.list;} 
}
@Html.Grid(data).Columns(columns =>
{
columns.Add(c => c.APPLICATION_NO).Titled("Application No");
})
Run Code Online (Sandbox Code Playgroud)

但它没有用,任何人都可以对此有所了解.
现在如果我做这样的事情就行了

@if(some conditon)
    {
    @{IEnumerable<BC.Models.APPLICATION> data = ViewBag.list;} 
    @Html.Grid(data).Columns(columns =>
    {
    columns.Add(c => c.APPLICATION_NO).Titled("Application No");
    })
    }
    else
    {
    @{IEnumerable<BC.Models.RIGHTS> data = ViewBag.list;} 
    @Html.Grid(data).Columns(columns =>
    {
    columns.Add(c => c.APPLICATION_NO).Titled("Application No");
    })
    }
Run Code Online (Sandbox Code Playgroud)

我的问题是APPLICATION_NO属性存在于两个Model类中,所以我不想使用它

    @Html.Grid(data).Columns(columns =>
    {
    columns.Add(c => c.APPLICATION_NO).Titled("Application No");
    })
Run Code Online (Sandbox Code Playgroud)

我的代码中有两次.

Jot*_*aBe 5

你的问题是你没有使用MVC中最重要的概念:视图模型.

至于你最后的评论,你想要使用的是一个视图模型,即专门为向视图发送数据以显示它而创建的类.

为此:

  1. 创建一个具有APPLICATION_NO(视图模型类所需)的公共类
  2. 创建另一个公共类,它将成为您的视图模型.这是一个在剃刀模板上根据需要对数据进行整形的类(在这种情况下,它将保存1中定义的类的列表)
  3. 在控制器中,返回传递模型的视图作为第二个参数.即不使用ViewBag/ ViewData,而是使用视图模型,就像这样return View("ViewName", model)
  4. 在视图中使用模型:声明模型类型@model并使用提供的Model变量在Razor模板中使用它

通过这种方式,您可以在服务器上整形数据,并避免在Razor模板中包含大量代码(这是不可取的).当然,你有智能感知,你的模板会被输入.

代码为1:

public class ApplicationModel
{
   public int APPLICATION_NO {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

代码为2:

public class ApplicationsViewModel
{
   public List<ApplicationModel> Applications { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

代码3(控制器内)

var model = new ApplicationsViewModel();

if (...) // include the condition to choose the kind of data inside the list
{
   model.Applications = list.Select(item =>
     new ApplicationModel { APPLICATION_NO = item.APPLICATION_NO } ).ToList()
}
else
{
   // same code here, for the other kind of data in the list
}

// return the view with this model
return View("ApplicationView", model);
Run Code Online (Sandbox Code Playgroud)

代码为4:

// decalre the model type at the beginning
@model YourNamespace.ApplicationViewModel;

// access the model using the Model variable
@Html.Grid(Model.Applications).Columns(columns =>
  {
  columns.Add(c => c.APPLICATION_NO).Titled("Application No");
  })
Run Code Online (Sandbox Code Playgroud)

这允许您构建具有多个优点的MVC应用程序,例如可测试性,代码重用,可读性或可用性ModelState.相信我,很多这些东西真的非常重要,特别是ModelState.

此外,您可以在视图模型中使用代码注释(为HTML帮助程序提供额外信息的属性),这些属性可以提供标签,验证和一些其他自动功能.

不要怀疑在视图模型中包含所有必需的属性.

使用视图模型可以创建特殊类,而无需更改域或业务层类,即您不需要使用接口,代码注释等.但是很多时候,在业务类中添加代码注释并将它们嵌套在视图模型中是很有趣的.

请记住,有时您可以使用相同的视图模型将数据发布回服务器,并将其指定为POST操作的参数类型.

顺便说一句,接口解决方案是一个很好的解决方案,但这个解决方案不需要接口.(使用该接口,此解决方案将有更好的实现,但这是您的选择).