如何将DropDown和Textbox链接到我的Model的数据?

时间:2017-03-01 16:06:50

标签: asp.net-mvc-4 html.dropdownlistfor

这是我的模型的代码。 ListBuilder.DropDown是一个公共类函数的一部分,当提供将在数据库上调用的存储过程的字符串名称时,它只返回一个List。

在try语句中有一些共享的公共类代码(与存储过程相关),但该实现与我遇到的问题无关。成功检索数据并将其存储到模型中。

public class PositionViewModel
{
    [Display(Name = "Series")]
    public string series { get; set; }
    public int seriesID { get; set; }
    public List<SelectListItem> list_Series { get; set; }
}

public PositionViewModel(string id)
{
    Get(id);
    this.list_Series = ListBuilder.DropDown(AppConstants.StoredProc_GetSeries);
}


public Position Get(string id)
{
    ExecStoredProcedure sp = null;
    DataTable dt = new DataTable();

    try
    {
        sp = new ExecStoredProcedure(AppConstants.SP_POSITION_GET, new ConnectionManager().GetConnection(), AppConstants.SP_POSITION_GET);
        sp.SPAddParm("@PD_ID", SqlDbType.Char, id, ParameterDirection.Input);

        dt = sp.SPselect();

        if (dt.Rows.Count > 0)
        {
            this.pd_id = dt.Rows[0]["PD_ID"].ToString();
            this.official_title = dt.Rows[0]["label"].ToString();
            this.series = dt.Rows[0]["Series"].ToString();
            this.grade = dt.Rows[0]["Grade"].ToString(); 
            this.PDType = dt.Rows[0]["PDType"].ToString();
        }
    }

    catch (Exception ex)
    {
        throw ex;
    }

    finally
    {
        sp.dbConnection.Close();
    }

    return this;

}

以下是我的控制器的代码

[HttpGet]
public ActionResult PositionEdit(string id)
{
    PositionViewModel model = new PositionViewModel(id);
    return View("PositionEdit", model);
}

[HttpPost]  
public ActionResult PositionEdit(PositionViewModel model)
{
    if (ModelState.IsValid)
    {
        int rc = model.Update();
        return RedirectToAction("PositionView");
    }
    else
    {
        return View("PositionEdit", model);
    }
}

以下是我的观点代码。我想要的是一个包含model.seriesID(序列号)的下拉列表,但是当用户选择一个项目时,它将使用model.series(系列名称)更新文本框

@model Project.Models.PositionViewModel


@{
    ViewBag.Title = "Edit Position Description";
}

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)



    <div class="editor-label">
        @Html.LabelFor(model => model.series)
    </div>


    <div class="editor-field">
        @Html.DropDownListFor(model => Model.seriesID, Model.list_Series, new { style = "width:550px" })
        @Html.ValidationMessageFor(model => Model.seriesID)
    </div>


    <div class="editor-field">
        @Html.TextBoxFor(model => model.series, new { style = "width:250px;" })
        @Html.ValidationMessageFor(model => model.series)
    </div>



    <div class="toppad20">
        <input type="submit" value="Save" />
    </div>

}

我无法将下拉列表与文本框关联起来。我需要某种onChange事件吗?在此先感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您的解决方案涉及将字符串传递到视图模型的构造函数中。但是,在post上,模型绑定器将无法使用除无参数构造函数之外的任何实例来实例化视图模型。这部分原因,但不是唯一的原因,视图模型不应该处理像数据存储访问这样的事情。这是控制器的工作

在您的视图模型上,将list属性保留为自动实现的属性,然后在 controller 中调用ListBuilder.DropDown,您可以使用模型中的数据来调用点。