MVC Model Property by string Name

时间:2014-10-01 11:52:03

标签: 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").Value</td>
      <td>currentitem("Data2").Value</td>
      <td>currentitem("Data3").Value</td>
   </tr>
Next

有可能吗?

2 个答案:

答案 0 :(得分:0)

好了 - 现在我们已经确定您需要更改视图模型的顺序,让我们对您的视图模型做一些工作,以便更改顺序。鉴于我们必须改变显示事物的顺序,我们必须有一种方法来跟踪显示它们的顺序。在视图中动态更改而不会有不同的顺序(可能会很快乱) - 所以让我们稍微更新我们的模型。

假设这是您的视图模型

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;}
}

现在,让我们将您的视图模型更新为一组这些DataProperties。我们正在使用我们可以枚举的内容并按显示顺序排序。

public class UpdatedViewModel{
   public IEnumerable<DataProperty> DataSet {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;

在您的视图中,按显示顺序属性排序。请注意,我们现在可以使用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>
}}

应以HTML格式呈现

<tr>
   <td>data3</td>
   <td>data1</td>
   <td>data2</td>
</tr>

答案 1 :(得分:0)

谢谢 Tommy

我试图以简单的方式解决它并做到了这一点:

例如,我有一个包含列顺序的Viewdata:

ViewData("columnsorder")="|3|1|2|"

然后,我只是遍历ViewData并设置列。

@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