我正在使用WebMatrix 3.0和SQL CE来创建.cshtml webform。
问题:我有一个通过查询表中的所有记录动态创建的复选框列表。对于每个带有值ID的复选框,我想设置checked ="选中"仅当值ID对应于另一个表中的行时。
更多细节: 我有一个数据库,其中包含两个基本数据表(" person"和#34; socialMedia")和第三个表(" persMedia")。 " persMedia"表存在以管理" person"之间的多对多关系。和#34; socialMedia"。表"人"有一个名为ID的主键。表" socialMedia"还有一个名为ID的主键。表" persMedia"有两列名为personID和siteID。假设一个人被列入" person"表ID = 1。假设该人有两个社交媒体帐户列在" socialMedia" ID值为4和7的表。在这种情况下," persMedia"中有两行。 tableID的personID和siteID值为1,4和1,7。
我正在创建一个表单,其中从URL请求id值。然后我查询" person"主键等于id值的行的表。然后,我创建一个复选框列表。 " socialMedia"中的每个记录都有一个复选框。表。因此,每个复选框都有name =" socialM"和value =" @ social.ID"。到目前为止,非常好。
这是问题所在。对于每个复选框,我想将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 />
}
当我修改上面的行时,试图根据具有多对多关系的表的查询来检查某些框,这就是我想出的。
<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 />
}
我收到的错误是&#34;只有赋值,调用,递增,递减,等待和新对象表达式才能用作语句。&#34;我尝试了几种变体并收到了其他一些错误。底线:如何在动态创建的复选框列表中设置选中的值?
答案 0 :(得分:0)
Razor功能非常强大,它可以让您以直观的方式将代码与html混合。但是,它主要喜欢代码在一行而html在不同的行上。在这里你可能试图在一行上做太多,所以让我们简化这一行。你真正想要的是
<input type="checkbox" name="social" value="@socialM.ID" checked=@mycheckedvariable>@socialM.site<br />
现在让我们弄清楚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 />
}
最后,mycheckedvariable是一个糟糕的名字,选择更好的东西。对于我自己的代码,我可能会使用linq来确定是否应该设置复选框,但这超出了答案的范围。