Razor 根据SQL CE查询,将动态复选框列表值设置为选中

Razor 根据SQL CE查询,将动态复选框列表值设置为选中,razor,checkbox,sql-server-ce,webmatrix,Razor,Checkbox,Sql Server Ce,Webmatrix,我正在使用WebMatrix 3.0和SQL CE创建一个.cshtml Web表单 问题:我有一个通过查询表中的所有记录动态创建的复选框列表。对于每个具有值ID的复选框,我只想在值ID对应于另一个表中的行时设置checked=“checked” 更多详情: 我有一个数据库,包含两个基本数据表(“person”和“socialMedia”)和第三个表(“persMedia”)。“persMedia”表用于管理“person”和“socialMedia”之间的多对多关系。表“person”有一个名

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

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

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

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

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

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 />
    }
帐户:

@foreach(getSocMedia中的var socialM){ @社交网站
}
当我修改上面的几行时,为了根据具有多对多关系的表的查询检查一些框,我想到了以下内容

<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 />
    }
帐户:

@foreach(getSocMedia中的var socialM){ @社交网站
}

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

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

<input type="checkbox" name="social" value="@socialM.ID" checked=@mycheckedvariable>@socialM.site<br />
@socialM.site
现在让我们算出mycheckedvariable。在循环中找到它,主要是在你拥有它的时候

@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 />
}
@foreach(getSocMedia中的var socialM){
字符串mycheckedvariable=“”;
foreach(getPersMedia中的var persmed){
if(persmed.personID!=null){
mycheckedvariable=“checked”;
break;//这将退出内部foreach循环
}
}
@社交网站
}

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

这似乎很接近。无论数据库中的值如何,都会选中所有框。我尝试调整代码,更改“mycheckedvariable!”null'到'mycheckedvariable=null'。当我这样做时,我得到了一个错误:“WebMatrix.Data.DynamicRecord”不包含“personID”的定义。如果它不包含定义,那么在我将“!=”更改为“=”之前,我不理解如何计算它以确定它是否为null。好吧,这是一个愚蠢的错误。我忘了用“=”而不是“=”。但是,无论在哪种情况下,都会选中所有框,而不考虑表中的数据。不知道为什么,我想出来了!无论数据库中的数据如何,都选中了所有框。当我选中页面源代码时,不应选中(但已选中)复选框的HTML为:。我用checked=“(@mycheckvariable.Length!=0)”替换checked=@mycheckedvariable解决了这个问题。我的代码中的一个错误是,您可以将@mycheckvariable替换为checked=@mycheckedvariable,而不是checked=@mycheckedvariable,它将包含一个空字符串,或者“checked”,这会更清楚一些。