1

我正在尝试在 texbox 中输入“UserId”,当我单击“Find User”按钮时,我需要根据 UserId 从数据库中获取“UserName”和“Role”并将它们显示在 texboxes 中,以便如果用户名和角色必须被编辑,它们将被编辑并更新到数据库。

但是,当我输入 UserId 时,模型中的 UserId 值可用,我可以查询数据库并获取结果并将它们分配给模型的用户名和角色(Model.UserName 和 Model.Role),但我是无法将它们绑定到 HTML.TextBoxFor。

我有一个像下面这样的模型

public class EditUserInfoModel
    {

        [Display(Name = "User ID")]
        public string UserId { get; set; }

        [Display(Name = "User Name")]
        public string UserName { get; set; }

        [Display(Name = "Role")]
        [DataType(DataType.Text)]
        public string Role { get; set; }
}

..和控制器如下

[HttpPost]
public ActionResult EditUserInfo(EditUserInfoModel model)
{
    if (ModelState.IsValid)
    {
        string con = ConfigurationManager.ConnectionStrings["DMSCON"].ConnectionString;
        DataTable dt = new DataTable();
        SqlConnection dbCon = new SqlConnection(con);
        SqlCommand cmd = new SqlCommand();
        cmd.CommandText = "select user_name,user_role from user_info where
        user_id=@userid";
        cmd.Parameters.Add(new SqlParameter("@userid", model.UserId));
        cmd.Connection = dbCon;
        dbCon.Open();
        SqlDataAdapter dap = new SqlDataAdapter(cmd);
        dap.Fill(dt);
        EditUserInfoModel myModel = new EditUserInfoModel();
        foreach (DataRow row in dt.Rows)
        {
            myModel.UserName = row["user_name"].ToString();
            myModel.Role = row["user_role"].ToString();
            //model.isBlocked =  (bool)row[""];
            //model.isExpired = (bool)row[""];
            // model.UserId = "somevalue";
        }

        return View("EditUserInfo", myModel);
    }
    return View();
}

和下面的视图

@model WebDMS.Models.EditUserInfoModel
@{
    ViewBag.Title = "EditUserInfo";
    //Layout = "~/Views/Shared/_LayoutPage1.cshtml";
}
<h2>
    EditUserInfo</h2>
@using (Html.BeginForm())
{
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>EditUserInfoModel</legend>
        <div class="editor-label">
            @Html.LabelFor(model => model.UserId)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.UserId)
            @Html.ValidationMessageFor(model => model.UserId)
        </div>
        <div class="editor-label">
            @Html.LabelFor(model => model.UserName)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.UserName)
            @Html.ValidationMessageFor(model => model.UserName)
        </div>
        <div class="editor-label">
            @Html.LabelFor(model => model.Role)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Role)
            @Html.ValidationMessageFor(model => model.Role)
        </div>
        <input type="submit" value="Find User" />
    </fieldset>
}
4

1 回答 1

0

您需要对控制器操作方法和视图模型进行少量修改。

模型

public class EditUserInfoModel
{
    [Required]
    [Display(Name = "User ID")]
    public string UserId { get; set; }

    [Required]
    [Display(Name = "User Name")]
    public string UserName { get; set; }

    [Required]
    [Display(Name = "Role")]
    [DataType(DataType.Text)]
    public string Role { get; set; }
}

控制器:

[HttpPost]
public ActionResult EditUserInfo(EditUserInfoModel model)
{
    string con = ConfigurationManager.ConnectionStrings["DMSCON"].ConnectionString;
    DataTable dt = new DataTable();
    SqlConnection dbCon = new SqlConnection(con);
    SqlCommand cmd = new SqlCommand();
    cmd.CommandText = "select user_name,user_role from user_info where
    user_id=@userid";
    cmd.Parameters.Add(new SqlParameter("@userid", model.UserId));
    cmd.Connection = dbCon;
    dbCon.Open();
    SqlDataAdapter dap = new SqlDataAdapter(cmd);
    dap.Fill(dt);
    EditUserInfoModel myModel = new EditUserInfoModel();
    foreach (DataRow row in dt.Rows)
    {
        myModel.UserName = row["user_name"].ToString();
        myModel.Role = row["user_role"].ToString();
    }

    //return View("EditUserInfo", myModel);    //try removing this line
     return View(myModel);      
}

如果您使用dataannotations,那么您不需要检查ModelState.IsValid您的操作方法。您@ValidationMessage在视图中的表单字段将具有更多意义,并将按预期工作

您不需要显式调用视图名称。让 MVC-3 处理它。而是按照此响应中的说明尝试。

这些不是我想说的管理和结构化方法。通过将它们放在块或块中,始终Close()Dispose()您的 Db 连接。制作分层结构,以便您可以将数据库交互与控制器操作分开。希望能帮助到你。using()try-catch-finally

于 2013-11-12T06:11:27.067 回答