Asp.net mvc 按字符串名称列出的MVC模型属性
填写表格的常用方法是:Asp.net mvc 按字符串名称列出的MVC模型属性,asp.net-mvc,vb.net,Asp.net Mvc,Vb.net,填写表格的常用方法是: @For Each item In Model Dim currentItem = item @<tr> <td>currentitem.Data1</td> <td>currentitem.Data2</td> <td>currentitem.Data3</td> </tr> Next 模型中每个项目的@ 当前项目=项目
@For Each item In Model
Dim currentItem = item
@<tr>
<td>currentitem.Data1</td>
<td>currentitem.Data2</td>
<td>currentitem.Data3</td>
</tr>
Next
模型中每个项目的@
当前项目=项目
@
currentitem.Data1
currentitem.Data2
currentitem.Data3
下一个
但出于某些原因(为了控制列的顺序),我希望通过字段的字符串名称来引用字段,如下所示:
@For Each item In Model
Dim currentItem = item
@<tr>
<td>currentitem("Data1").Value</td>
<td>currentitem("Data2").Value</td>
<td>currentitem("Data3").Value</td>
</tr>
Next
模型中每个项目的@
当前项目=项目
@
当前项(“数据1”)。值
currentitem(“数据2”).值
当前项(“数据3”)。值
下一个
这有可能吗?好的-现在我们已经确定您需要更改视图模型的顺序,让我们对视图模型做一些工作,以便更轻松地更改顺序。考虑到我们必须改变我们显示事物的顺序,我们必须有一种方法来跟踪以什么顺序显示它们。要在视图中动态更改,而不具有不同顺序的不同视图(可能会很快变得混乱),那么让我们稍微更新一下我们的模型 假设这是您的视图模型
public class OriginalViewModel{
public string Data1 {get;set;}
public string Data2 {get;set;}
public string Data3 {get;set;|
}
让我们创建一个名为DataProperty的新类。这将保存数据对象,并允许我们设置显示顺序,以便以后进行排序
public class DataProperty{
public int DisplayOrder {get;set;}
public string Data {get;set;}
}
现在,让我们将视图模型更新为这些数据属性的集合。我们使用的是可以枚举的东西,并按显示顺序排序
public class UpdatedViewModel{
public IEnumerable<DataProperty> DataSet {get;set;}
}
public类UpdatedViewModel{
公共IEnumerable数据集{get;set;}
}
现在,可以在每个属性元素上设置显示顺序
var listOfItems = new List<DataProperty>();
listOfItems.Add(new DataProperty{Data = "data1", DisplayOrder = 2});
listOfItems.Add(new DataProperty{Data = "data2", DisplayOrder = 3});
listOfItems.Add(new DataProperty{Data = "data3", DisplayOrder = 1});
var model = new UpdatedViewModel();
model.Data = listOfItems;
var listOfItems=new List();
Add(新数据属性{Data=“data1”,DisplayOrder=2});
Add(新数据属性{Data=“data2”,DisplayOrder=3});
Add(newdataproperty{Data=“data3”,DisplayOrder=1});
var model=新更新的ViewModel();
model.Data=listOfItems;
在视图中,按“显示顺序”属性排序。注意,我们现在可以使用Linq根据此视图的要求对数据进行适当的排序
@{foreach(var item in Model.OrderBy(x=>x.Data.DisplayOrder){
<tr>
<td>@item.Data</td>
<td>@item.Data</td>
<td>@item.Data</td>
</tr>
}}
@{foreach(Model.OrderBy(x=>x.Data.DisplayOrder)中的变量项){
@项目.数据
@项目.数据
@项目.数据
}}
哪个应该用HTML呈现
<tr>
<td>data3</td>
<td>data1</td>
<td>data2</td>
</tr>
数据3
数据1
数据2
谢谢你汤米
我试着用一种简单的方法解决它,并做到了:
例如,我有一个Viewdata,其中包含列的顺序:
ViewData("columnsorder")="|3|1|2|"
然后,我只是循环查看数据并设置列
@For Each item In Model
Dim currentItem = item
@<tr>
@For i As Integer = 1 To ViewData("columnsorder").ToString.Split("|").Count - 2
Dim ind As Integer = ViewData("columnsorder").ToString.Split("|")(i)
Select Case ind
Case 1@<td>@currentItem.Data1</td>
Case 2@<td>@currentItem.Data2</td>
Case 3@<td>@currentItem.Data3</td>
End Select
Next
</tr>
Next
模型中每个项目的@
当前项目=项目
@
@对于i As Integer=1到ViewData(“columnsorder”).ToString.Split(“|”).Count-2
Dim ind As Integer=ViewData(“列排序器”).ToString.Split(“|”)(i)
选择案例索引
案例1@@currentItem.Data1
案例2@@currentItem.Data2
案例3@@currentItem.Data3
结束选择
下一个
下一个
这不是您引用模型项的方式。唯一可行的方法是将您的模型设置为字典。
。尽管如此,您的理由毫无意义。“控制列的顺序”是什么意思?您可以用强类型模型轻松做到这一点。Tommy,谢谢。是的,这是一个愚蠢的问题,但是我想我可以这样做。这不是一个愚蠢的问题。我只是很难理解你为什么要这样做。我问你是因为如果我们更好地理解你为什么要这样做,我们可能会向你展示一种更好/不同的方法,而不是像你问的那样使用松散类型的变量。例如,在一种情况下,我必须在另一种情况下(data2,data3,data1),如何按以下顺序(data1,data2,data3,data1)显示列。据我所知,在控制器中执行此操作的更好方法是,但是否可以在视图中更改它?如果您的属性如您所述,则很难将其清理干净。如果您有一个数据的集合
,则可以在控制器中控制集合中项目的顺序,并对每个项目进行迭代(不使用字符串名称)。或者,如果您有预定义的列顺序,则可以创建多个局部视图,并根据需要的顺序有条件地呈现它们。