在MVC3 + razor视图上拆分字符串

时间:2011-05-12 06:56:06

标签: linq-to-sql asp.net-mvc-3 razor

我想获得帮助并指导我如何操作从MS-SQL数据库调用的文本/字符串。所以这是我的SettingController.cs索引查看的部分代码:

public ActionResult Index()
    {
        var datacontext = new SGM_SIDDataContext();
        var dataToView = from m in datacontext.SGMs
                         orderby m.Seq
                         select m;
        return View(dataToView.ToList());
    }

这是我的index.cshtml代码:

@model IEnumerable<MVC_Apps.Models.SGM>

@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Index</h2>

<p>
    @Html.ActionLink("Create New", "Create")
</p>
<table>
    <tr>
        <th>
            SID
        </th>
        <th>
            Abbrev
        </th>
        <th>
            Val
        </th>
        <th>
            Seq
        </th>
        <th></th>
    </tr>

@foreach (var item in Model)
{
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.SID)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Abbrev)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Val)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Seq)
        </td>
        <td>
            @Html.ActionLink("Edit", "Edit", new { id=item.GID })
        </td>
    </tr>
}

</table>

粗略地说,我得到了一个视图。现在这就是我想做的事情: 1)Index.cshtml视图中的数据'item.Val'将如下所示:

  

A,L,C,H

有点像那样。但可能是数据仅包含的行:

  

H或C或无(空值)

但是如果数据包含多个char,比如说它为K和L设置了,则item.Val中的数据将如下所示:

  

A,L

哪些数据用逗号分隔。所以现在我想要分割该item.Val数据并对其执行if语句。我想检查item.Val中的每个数据,如果它包含K或L或C或H或全部或不包含任何数据(抱歉,如果我的英语不好)。我希望将其视为,如果所有数据都包含H,那么在表视图中,将是名为Hotel的列,而如果数据也有L,则将显示另一列Lounge,并且会检查检查按钮。

item.Val中可能的char是:

A = Admin
L = Lounge
H = Hotel
C = Customer

任何帮助和想法非常感谢。先谢谢你。

更新信息:

谢谢我开始得到它是什么。我真正想要做的是,当item.Val确实包含H(用于酒店)时,视图将具有带有标题名称Hotel的表列,并且在记录中它将具有勾选复选框。

这是表格视图的示例图片:http://imagebin.org/152941

但是,酒店,管理员和用户信息是否为tick.Val 例如,对于Smith,item.Val数据如下所示:C, 例如,对于Anna,item.Val数据如下所示:H,C,

P.S:var conf行是测试代码。忽略它,因为我已经从我的源中删除它。 :)

1 个答案:

答案 0 :(得分:2)

创建类似于

的ViewModel
public class MyViewModel
{
  // items from your model
  public int Id{get;get;}
  public String Vals{get;set;} // A,L,C,H
  ...
  ...

  public bool IsHotel
  {
    get
    {
       return Vals.Split(',').Contains("H");
    }
  }   

  public bool IsAdmin      
  {
    get
    {
       return Vals.Split(',').Contains("A");
    }
  } 

  public bool IsCust
  {
    get
    {
       return Vals.Split(',').Contains("C");
    }
  } 

}

在控制器动作中

public ActionResult Index()
{
   var datacontext = new SGM_SIDDataContext();
   var dataToView = from m in datacontext.SGMs
                    orderby m.Seq
                    select new MyViewModel()
                    {
                      // items from your datacontext
                      Id= m.SID, 
                      //etc...

                    };
   var conf = from m in datacontext.SGMs // what's the purpose of this query??
                     select m.Val;

   return View(dataToView.ToList());
}

视图需要更新,因此包括Hotel,Cust,Admin和您需要的任何其他列。我建议您保持简单,不要尝试动态创建HTML列。如果要执行此操作,可能需要首先检查列表中每个对象中的所有Vals,以确定需要哪些列。在视图中

@foreach (var item in Model)
{
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.SID)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Abbrev)
        </td>
        <td>
          @(item.IsHotel? "Checked" : "")
        </td>
        <td>
          @(item.IsAdmin? "Checked" : "")
        </td>
        <td>
          @(item.IsCust? "Checked" : "")
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Seq)
        </td>
        <td>
            @Html.ActionLink("Edit", "Edit", new { id=item.GID })
        </td>
    </tr>
}