Выберите значение раскрывающегося списка из объединенной таблицы на веб-страницах бритвы (с помощью WebMatrix)

Я изучаю программирование веб-страниц ASP.Net с использованием Webmatrix (с синтаксисом бритвы).

Цель состоит в том, чтобы выпадающие списки заполнялись значениями, хранящимися в таблице, и выбранным значением, поступающим из другой объединенной таблицы.

Выбранное значение должно отображаться до и после сообщения.

Я также хочу, чтобы, если в таблице UserProfiles нет UserTypeId (UserTypeId == NULL), по умолчанию отображалось «Пожалуйста, выберите».

Таблица 1: Типы пользователей с полями UserTypeId и Name Таблица 2: Профили пользователей с UsertypeId в качестве внешнего ключа

У меня есть следующее сообщение об ошибке, и я не могу найти, как решить эту проблему: Оператор «==» не может быть применен к операндам типа «int» и «WebMatrix.Data.DynamicRecord».

Раздел КОД:

var db = Database.Open("MyDatabase");

Чтобы получить UserTypeId, хранящийся в таблице UserProfiles для подключенного пользователя

var selectedUserTypeId = db.QuerySingle("SELECT UserTypeId FROM UserProfiles INNER JOIN Users ON UserName=@0",authenticatedUser);

Чтобы получить список типов пользователей

var sqlUserTypeData = "SELECT userTypeId, Name FROM UserTypes";
var userTypeData = db.Query(sqlUserTypeData);

var userTypeDataList = userTypeData.Select(userTypeDataListItem => new SelectListItem {
    Value = userTypeDataListItem.UserTypeId.ToString(),
    Text = userTypeDataListItem.Name,
    Selected = userTypeDataListItem.UserTypeId == selectedUserTypeId ? true : false
});

В последней строке возникает проблема: userTypeDataListItem.UserTypeId == selectedUserTypeId. Эти типы, по-видимому, нельзя сравнивать.

if(!IsPost){
    var sqlUserData = @"SELECT *,  UserTypes.Name AS UserType
                        FROM UserProfiles
                        INNER JOIN Users ON Users.UserId = UserProfiles.UserId 
                        INNER JOIN UserTypes ON UserTypes.UserTypeId = UserProfiles.UserTypeId 
                        WHERE Users.UserName=@0";

    var userData = db.QuerySingle(sqlUserData,authenticatedUser);

    userType = userData.UserType;
    }

if(IsPost){
    Validation.RequireField("userTypeCombo", "Please select");

    userId = Request.Form["userId"];
    userTypeId = Request.Form["userTypeCombo"];

if(Validation.IsValid()) {
        var updateCommand = @"UPDATE UserProfiles
                            SET UserTypeId=@0
                            WHERE UserId=@1";
        db.Execute(updateCommand, userTypeId, userId);
        Response.Redirect("~/authcontent/user");
    }

Раздел HTML:

@if (isAuthenticated) {
    <form action="" method="post">
        @Html.ValidationSummary()
        <section class="infoblock">
            <fieldset>
                <legend>Mon profil</legend>
                <ul>
                    <li><label for="userType">Profil</label>
                        @Html.DropDownList("userTypeCombo", "Please select", userTypeDataList)</li>
                </ul>
            </fieldset>
        </section>
    </form>        
}

person user1455103    schedule 16.09.2012    source источник


Ответы (1)


Вы должны решить проблему, выделенную этим сообщением об ошибке, заменив

var selectedUserTypeId = db.QuerySingle(...)

с участием

var selectedUserTypeId = db.QueryValue(...)

или указав поле записи:

Selected = userTypeDataListItem.UserTypeId == selectedUserTypeId.UserTypeId ? true : false
person GmG    schedule 17.09.2012
comment
Спасибо за решение(я). Однако у меня есть дополнительная проблема: selectedUserTypeId может (это нормально) быть NULL. В этом случае выдается следующая ошибка: Оператор '==' не может быть применен к операндам типа 'int' и 'System.DBNull'. Каков наилучший способ справиться с этим? В идеале, если значение равно null, я бы хотел, чтобы в раскрывающемся списке отображалось значение по умолчанию. Пожалуйста, выберите. - person user1455103; 20.09.2012
comment
Если selectUserTypeId имеет значение null, присвойте ему значение int, которого не может быть в UserTypeId (0 или отрицательное значение), что-то вроде selectUserTypeId = selectUserTypeId == null ? 0 : selectUserTypeId;. Таким образом, будет отображаться выбор по умолчанию. - person GmG; 21.09.2012