【问题标题】:Set dynamic checkbox list values to checked, based upon SQL CE query根据 SQL CE 查询将动态复选框列表值设置为选中
【发布时间】:2014-09-14 04:28:28
【问题描述】:

我正在使用 WebMatrix 3.0 和 SQL CE 创建一个 .cshtml 网络表单。

问题:我有一个复选框列表,这些复选框是通过查询表中的所有记录动态创建的。对于每个具有值 ID 的复选框,只有当值 ID 对应于另一个表中的一行时,我才想设置 checked="checked" 。

更多细节: 我有一个数据库,其中包含两个基本数据表(“person”和“socialMedia”)和第三个表(“persMedia”)。 “persMedia”表的存在是为了管理“person”和“socialMedia”之间的多对多关系。表“person”有一个名为 ID 的主键。表“socialMedia”也有一个名为 ID 的主键。表“persMedia”有两列名为 personID 和 siteID。假设一个人列在 ID=1 的“人”表中。假设该人在“socialMedia”表中列出了两个社交媒体帐户,ID 值为 4 和 7。在这种情况下,“persMedia”表中将有两行 personID 和 siteID 值为 1,4 和 1, 7.

我正在创建一个从 URL 请求 id 值的表单。然后,我在“person”表中查询主键等于 id 值的行。然后,我创建一个复选框列表。 “socialMedia”表中的每条记录都有一个复选框。因此,每个复选框都有 name="socialM" 和 value="@social.ID"。到目前为止,一切顺利。

这就是问题所在。对于每个复选框,如果“persMedia”表中有一行的 personID 记录等于 id 且 siteID 值等于@social.ID,我想将选中的属性设置为“checked”。我该怎么做呢?我尝试了以下代码的几种变体。

var id=Request["id"];
var SQLSELECT = "SELECT * FROM person WHERE @0=ID";
var db = Database.Open("mydatabase");
var person = db.QuerySingle(SQLSELECT,id);

var getSocMedia = db.Query("SELECT ID, site FROM socialMedia");

var getPersMedia = db.Query("SELECT personID FROM persMedia");

下面的这些行创建一个复选框列表,默认情况下没有选中任何复选框。

<p>Accounts:</p>
    @foreach(var socialM in getSocMedia){
        <input type="checkbox" name="social" value="@socialM.ID" />@socialM.site<br />
    }

当我修改上面的行时,为了尝试根据具有多对多关系的表的查询来检查一些框,这就是我想出的。

<p>Accounts:</p>
    @foreach(var socialM in getSocMedia){
        <input type="checkbox" name="social" value="@socialM.ID" checked=@foreach(var persmed in getPersMedia){if(persmed.personID != null){"checked";}}>@socialM.site<br />
    }

我收到的错误是“只有赋值、调用、递增、递减、等待和新对象表达式可以用作语句。”我尝试了几种变体并收到了其他几个错误。底线:如何在动态创建的复选框列表中设置选中的值?

【问题讨论】:

    标签: razor checkbox sql-server-ce webmatrix


    【解决方案1】:

    Razor 非常强大,它可以让您以直观的方式将代码与 html 混合。但是,它最喜欢代码位于一行,而 html 位于另一行。在这里,您可能试图在一行上做太多事情,所以让我们简化该行。你真正想要的是

    <input type="checkbox" name="social" value="@socialM.ID" checked=@mycheckedvariable>@socialM.site<br />
    

    现在让我们找出 mychecked 变量。在循环中找到它,主要是你拥有它

    @foreach(var socialM in getSocMedia){
        string mycheckedvariable = "";
        foreach (var persmed in getPersMedia) {
           if (persmed.personID != null ) {
               mycheckedvariable = "checked";
               break;    // this exits the inner foreach loop
           }
        }
        <input type="checkbox" name="social" value="@socialM.ID" checked=@mycheckedvariable>@socialM.site<br />
    }
    

    最后,mycheckedvariable 是一个糟糕的名字,选择更好的名字。对于我自己的代码,我可能会使用 linq 来确定是否应该设置复选框,但这超出了答案的范围。

    【讨论】:

    • 这似乎很接近。无论数据库中的值如何,都会选中所有框。我尝试调整代码,将“mycheckedvariable!= null”更改为“mycheckedvariable = null”。当我这样做时,我收到了这个错误:“WebMatrix.Data.DynamicRecord”不包含“personID”的定义。如果它不包含定义,那么在我将“!=”更改为“=”之前,我不明白如何评估它以确定它是否不为空。
    • 好吧,愚蠢的错误。我忘了用“==”代替“=”。但是,无论表中的数据如何,在任何一种情况下都会选中所有框。不知道为什么。
    • 想通了!无论数据库中的数据如何,所有框都被选中。当我检查页面源时,不应该检查(但被检查)的复选框的 HTML 是:。我通过将 checked=@mycheckedvariable 替换为 checked="(@mycheckvariable.Length != 0)" 来解决这个问题。
    • 我的代码中的一个错误是,您可以只输入@mycheckvariable,而不是checked=@mycheckedvariable,它要么有一个空字符串,要么是“checked”,这样会更清楚一些。
    猜你喜欢
    • 1970-01-01
    • 2013-12-16
    • 1970-01-01
    • 2011-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-12
    • 2020-06-25
    相关资源
    最近更新 更多