通过Checkbox Web窗体和Cookie查看数据库列

时间:2011-09-23 16:37:01

标签: asp.net-mvc-3 cookies checkbox telerik-grid telerik-mvc

我正在使用telerik MVC模板并且拥有一个包含大量列的数据库且telerik网格没有水平滚动条,因此我创建了复选框,供用户准确选择要查看的列。它运行得很好,因为当我第一次进入页面时,它会在顶部显示复选框,其中包含Apply按钮和下面的网格视图。由于WebForm中未提交任何内容,因此网格视图显示所有列。在添加cookie之前,用户只需按一次申请即可显示这些列。但是,如果用户随后尝试对其中一列进行排序或过滤,则会恢复显​​示所有列。因此,我创建了一个cookie来存储所选信息。不幸的是,这只能帮助选择第一个过滤器。如果使用第二个过滤器,它将再次显示所有列而不是仅显示所选列。此外,用户现在必须按两次应用选项才能在网格视图上正确显示。以下是我如何编码所有内容的简要说明:

索引视图

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<% using (Html.BeginForm("Index", "Order"))
   { %>
    <p>
        <%= Html.CheckBox("osurr", true, "Ad Number")%>Ad Number        //I set this and a few other columns to default to true
        <%= Html.CheckBox("csurr", false, "Customer Number")%>Customer Number
        <%= Html.CheckBox("rhosurr", false, "RHO Number")%>RHO Number
        <%= Html.CheckBox("lockid", false, "Lock ID")%>Lock ID
                                //And several more
    </p>
    <input type="submit" value="Apply" />
<% } %>
<%
    Html.Telerik().Grid(Model)
        .Name("Grid")
        .Columns(columns =>
                     {
                         columns.Template(o =>
                                              {
%>
                      <%=Html.ActionLink("Detail", "Edit", new { id = o.osurr })%>
                  <%
                                              }).Width(25);


                         if (Request.Cookies["DBCols"]["csurr"] != null)
                     {
                         if (Request.Cookies["DBCols"].Values["csurr"].Equals("True")) { columns.Bound(o => o.csurr).Title("Cust. No."); }
                     }
                     if (Request.Cookies["DBCols"]["rhosurr"] != null)
                     {
                         if (Request.Cookies["DBCols"].Values["rhosurr"].Equals("True")) { columns.Bound(o => o.rhosurr).Title("RHO No."); }
                     }
                     if (Request.Cookies["DBCols"]["lockid"] != null)
                     {
                         if (Request.Cookies["DBCols"].Values["lockid"].Equals("True")) { columns.Bound(o => o.lockid).Title("Lock ID"); }
                     }
                                                                                                    //And again, several more.
                     })
        .Groupable(grouping => grouping.Enabled(true))
        .Resizable(resizing => resizing.Columns(true))
        .Filterable(filter => filter.Enabled(true))
        .Sortable(sorting => sorting.Enabled(true))
        .Pageable(paging => paging.Enabled(true).PageSize(25))
        .Render();   
%>


</asp:Content>

控制器

public ActionResult Index(bool? csurr, bool? rhosurr, bool? lockid /* And Several More */)
{
ViewData["csurr"] = csurr ?? true;
ViewData["rhosurr"] = rhosurr ?? true;
ViewData["lockid"] = lockid ?? true;

if ((bool)ViewData["csurr"]) { DBCols.Values["csurr"] = (ViewData["csurr"].ToString());
}
else { DBCols.Values["csurr"] = "False"; }
if ((bool)ViewData["rhosurr"]) { DBCols.Values["rhosurr"] = (ViewData["rhosurr"].ToString()); }
else { DBCols.Values["rhosurr"] = "False"; }
if ((bool)ViewData["lockid"]) { DBCols.Values["lockid"] = (ViewData["lockid"].ToString()); }
else { DBCols.Values["lockid"] = "False"; }
//And Several more

var db = new MillieOrderDB();
var listView = from m in db.vw_cadords
orderby m.createstamp descending
select m;
return View(listView);
}

我现在只是在Index ActionResult中工作,以便将事情保存在一个地方,同时我想出如何让这一切工作。任何人都有任何想法,为什么我不得不按两次申请,为什么我不能使用多个过滤器,以及如何避免这种情况?

1 个答案:

答案 0 :(得分:0)

事实证明,我必须点击两次的原因以及为什么在应用多个过滤器时导致问题的原因是因为我在Index ActionResult中拥有了所有内容。一旦我将所有表单数据移动到自己的ActionResult然后执行了RedirecttoAction(“Index”),一切正常!