从razor网页中的联接表中选择下拉列表值(使用WebMatrix)

从razor网页中的联接表中选择下拉列表值(使用WebMatrix),razor,drop-down-menu,helper,webmatrix,asp.net-webpages,Razor,Drop Down Menu,Helper,Webmatrix,Asp.net Webpages,我正在学习使用Webmatrix(使用razor语法)进行ASP.Net网页编程 目标是让下拉列表框由存储在表中的值和来自另一个联接表的选定值填充 所选值应在post前后显示 我还希望,如果UserProfiles表中没有UserTypeId(UserTypeId==NULL),将显示默认的“请选择” 表1:具有UserTypeId和Name字段的UserTypes 表2:UsertypeId作为外键的UserProfiles 我收到以下错误消息,但找不到如何解决该问题:运算符“==”无法应用于

我正在学习使用Webmatrix(使用razor语法)进行ASP.Net网页编程

目标是让下拉列表框由存储在表中的值和来自另一个联接表的选定值填充

所选值应在post前后显示

我还希望,如果UserProfiles表中没有UserTypeId(UserTypeId==NULL),将显示默认的“请选择”

表1:具有UserTypeId和Name字段的UserTypes 表2:UsertypeId作为外键的UserProfiles

我收到以下错误消息,但找不到如何解决该问题:运算符“==”无法应用于“int”和“WebMatrix.Data.DynamicRecord”类型的操作数

代码部分:

var db = Database.Open("MyDatabase");
@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>        
}
为连接的用户获取存储在UserProfiles表中的UserTypeId

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部分:

var db = Database.Open("MyDatabase");
@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>        
}
@if(已验证){
@Html.ValidationSummary()
蒙profil
  • Profil @DropDownList(“userTypeCombo”,“请选择”,userTypeDataList)
}
您应该解决此错误消息突出显示的问题

var selectedUserTypeId = db.QuerySingle(...)

或指定记录字段:

Selected = userTypeDataListItem.UserTypeId == selectedUserTypeId.UserTypeId ? true : false

感谢您的解决方案。然而,我还有一个问题:selectedUserTypeId可以(这是正常的)为空。在这种情况下,会引发以下错误:“运算符“==”不能应用于“int”和“System.DBNull”类型的操作数。处理这个问题的最佳方法是什么?理想情况下,如果该值为null,我希望下拉列表显示默认的“请选择”。如果selectUserTypeId为null,则为其分配一个UserTypeId中不存在的int值(0或负值),类似于
selectUserTypeId=selectUserTypeId==null?0:选择UserTypeId。这样将显示默认选项。