@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");
})
代码无法工作,因为数据被声明到 if 块中。如果网格只能在两个类的共享字段上工作,您可以考虑使用 APPLICATION 和 RIGHTS 将实现的接口并更改如下代码:
@{IEnumerable<BC.Models.IAPPLICATION_NO> data = (IEnumerable<BC.Models.IAPPLICATION_NO>)ViewBag.list;}
@Html.Grid(data).Columns(columns =>
{
columns.Add(c => c.APPLICATION_NO).Titled("Application No");
})
其中 IAPPLICATION_NO 是一个接口,如:
public interface IAPPLICATION_NO
{
string APPLICATION_NO { get; }
}
我不知道APPLICATION_NO是什么,所以我使用了string,接口只能定义get for grid。
否则,如果您需要为这两种类型显示不同的数据,您应该考虑在 if 块中使用两个视图或不同的网格声明。
我在 VS 上研究了我的答案样本:
我附上代码:
public interface AInterface
{
string AProperty { get; }
}
public class AList : AInterface
{
public string AProperty { get; set; }
}
public class BList : AInterface
{
public string AProperty { get; set; }
}
这些是课程
现在控制器:
public class TestController : Controller
{
public ActionResult Index()
{
var random = new Random((int)DateTime.Now.Ticks);
if (random.Next() % 2 == 0)
ViewBag.List = new List<AList> { new AList { AProperty = "Atestvalue" } };
else
ViewBag.List = new List<BList> { new BList { AProperty = "Atestvalue" } };
return View();
}
}
和观点:
@{
ViewBag.Title = "Index";
IEnumerable<TestMvcApplication.Interfaces.AInterface> test = ViewBag.List;
}
<h2>Index</h2>
@foreach (var item in test)
{
<div>
@item.AProperty
</div>
}
如您所见,这解决了您的问题
不使用接口:
@{IEnumerable<dynamic> data = (IEnumerable<dynamic>)ViewBag.list;}
@Html.Grid(data).Columns(columns =>
{
columns.Add(c => c.APPLICATION_NO).Titled("Application No");
})
但是您丢失了 IntelliSense 完成,如果该成员丢失,我认为您会收到运行时错误。
我尝试了您的 Grid 程序集,但它使用 c# Expression 并且与动态不兼容。另一种解决方案可能是在控制器中使用 LINQ 将一个列表转换为另一个:
IEnumerable<BC.Models.Application> data;
if (some condition)
{
data = applicationList; //applicationList's type is IEnumerable<BC.Models.Application>
}
else
{
data = rightsList.Select(t => new Application { APPLICATION_NO = t.APPLICATION_NO }); //rightsList's type is IEnumerable<BC.Models.RIGHTS>
}
ViewBag.list = data;
在视图中,您可以将发布的工作代码保留在问题的顶部。您没有多类型 IEnumerable 支持,因为您只使用一种类型,但没有在这些类之间使用公共接口我认为我们必须进行反射,但我认为很难编写该代码。