2014-09-14 6 views
2

WebMatrix 3.0 및 SQL CE를 사용하여 .cshtml 웹 폼을 만듭니다.SQL CE 쿼리에 따라 동적 확인란 목록 값을 선택하십시오.

문제점 : 테이블의 모든 레코드를 쿼리하여 동적으로 생성 된 확인란 목록이 있습니다. 값 ID가있는 각 확인란에 대해 값 ID가 다른 테이블의 행에 해당하는 경우에만 checked = "checked"로 설정하려고합니다.

자세한 내용 : 두 개의 기본 데이터 테이블 ("person"및 "socialMedia")과 세 번째 테이블 ("persMedia")이 포함 된 데이터베이스가 있습니다. "persMedia"테이블은 "person"과 "socialMedia"간의 다 대다 관계를 관리하기 위해 존재합니다. 테이블 "person"에는 ID라는 기본 키가 있습니다. 테이블 "socialMedia"에는 ID라는 기본 키가 있습니다. 표 "persMedia"에는 personID 및 siteID라는 두 개의 열이 있습니다. 사람이 ID = 1 인 "사람"테이블에 나열된다고 가정 해보십시오. 사람이 4와 7의 ID 값을 가진 "socialMedia"테이블에 나열된 2 개의 소셜 미디어 계정을 가지고 있다고 가정 해보십시오.이 경우 personID와 siteID 값이 1,4와 1 인 두 개의 행이 "persMedia"테이블에 있습니다. 7.

URL에서 id 값을 요청하는 양식을 만듭니다. 그런 다음 id 값과 동일한 기본 키가있는 행에 대한 "사람"테이블을 쿼리합니다. 그런 다음 확인란 목록을 만듭니다. "socialMedia"테이블의 각 레코드에 대해 하나의 체크 박스가 있습니다. 따라서 각 확인란의 이름은 "socialM"이고 값은 "@ social.ID"입니다. 여태까지는 그런대로 잘됐다.

여기에 문제가 있습니다. 각 확인란에 대해 personID 레코드가 id이고 siteID 값이 @ social.ID 인 행이 "persMedia"테이블에있는 경우 checked 특성을 "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" [email protected](var persmed in getPersMedia){if(persmed.personID != null){"checked";}}>@socialM.site<br /> 
    } 

오류는 "할당, 호출, 증가, 감소, 대기 및 새 개체 표현식 만 명령문으로 사용할 수 있습니다."라는 오류가 표시됩니다. 몇 가지 대안을 시도하고 몇 가지 다른 오류가 발생했습니다. 결론 : 동적으로 생성 된 체크 박스 목록에서 체크 된 값을 어떻게 설정합니까?

답변

0

면도기는 직관적 인 방법으로 코드를 html과 혼합 할 수 있다는 점에서 매우 강력합니다. 그러나, 그것은 코드가 한 줄에 있고 HTML이 다른 줄에있는 것을 좋아합니다. 여기에서는 한 줄에 너무 많은 것을하려는 것일 수 있으므로 그 줄을 단순화합시다. 정말로 원하는 것은

<input type="checkbox" name="social" value="@socialM.ID" [email protected]>@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" [email protected]>@socialM.site<br /> 
} 

마지막으로, mycheckedvariable 끔찍한 이름이 대부분으로, 루프에서 그것을 찾을 수 있습니다. 그리고 내 자신의 코드에 대해 아마 linq을 사용하여 체크 박스를 설정해야하는지 결정할 수 있지만 그 범위를 벗어난다.

+0

가까운 것으로 보입니다. 데이터베이스의 값에 관계없이 모든 상자가 선택됩니다. 나는 'mycheckedvariable = null'로 'mycheckedvariable! = null'을 변경하면서 코드를 수정 해 보았습니다. 내가 그랬을 때, 나는이 오류가 발생했다 : 'WebMatrix.Data.DynamicRecord'에는 'personID'에 대한 정의가 없다.정의가 포함되어 있지 않으면 "! ="을 "="으로 변경하기 전에 null이 아닌지 여부를 판별하는 방법을 이해할 수 없습니다. – TJM

+0

좋아, 바보 같은 실수 야. "="대신 "=="을 사용하는 것을 잊었습니다. 그러나 모든 상자는 테이블의 데이터에 관계없이 두 경우 모두 검사됩니다. 이유를 모르겠다. – TJM

+0

그것을 알아 냈어! 모든 상자는 데이터베이스의 데이터에 관계없이 검사되었습니다. 페이지 소스를 검사했을 때 체크하지 말아야 할 체크 박스의 HTML은 다음과 같습니다 : . checked = @ mycheckedvariable을 checked = "(@ mycheckvariable.Length! = 0)"로 바꿈으로써이 문제를 해결했습니다. – TJM