MVC4 DropDownList对于如何返回选定的值

时间:2015-01-19 16:52:34

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

我正在尝试在MVC4视图中使用下拉列表,并且遇到Html.DropdownList different Behaviour,这导致我尝试使用@ Html.DropDownListFor(m => m.SelectedProdType,(IEnumerable)ViewBag.ProdTypes,“在我的视图中选择Product Type“,new {@ class =”form-control“}) - 在我将SelectedProdType更改为模型中的IEnumerable后工作 - (如果SelectedProdType是String或Integer则不起作用)。各种产品类型都已正确列出,可以在视图中选择,一切似乎都没有任何错误 - 除了ProdTypeID,我需要在选择时返回默认为0而不是所选产品类型的ID。我尝试在Controller中将SelectedProdType分配给ProdTypeID(在将其转换为Int之后) - 但这显然不起作用。我如何获得ID号码。返回的所选产品类型包含在提交此CREATE表单时保存到数据库的各种其他产品字段中,是吗?我正在使用存储过程与数据库(我不使用实体框架,虽然这不重要 - 所以,只有文本列表的例子 - 这似乎是我能找到的所有 - 没有帮助我)。

我的代码中提取的位数有限(希望这已经足够了)?

在模型中:

[Display(Name = "Select Product Type")]
public int ProdTypeID { get; set; }

public IEnumerable<SelectListItem> SelectedProdType { get; set; }

public DataSet GetProductsByTypes()
    {
        SqlConnection cn = new SqlConnection(@"Data Source=DHQWDBST101;User ID=wswebuser;Password=WSDBReader10!;Initial Catalog=WSTechnology");
        SqlCommand cmd = new SqlCommand("sp_GetProductsByTypes", cn);
        cn.Open();
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.ExecuteNonQuery();
        DataSet dst = new DataSet();
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        da.Fill(dst);
        cn.Close();
        return dst;            
    }

public int CreateProduct(int _OrganisationID, int _ProdTypeID, string _ProductName, string _ProductDescription, string _ProductComments, string _ProductProfileLocation, string _ProductProfileName, string _ProductMIMEType, string _ProductSerialNumber, int _CreatedBy, bool _MarkedDelete, int _NewProductID)  
    {
        SqlConnection cn = new SqlConnection(@"Data Source=DHQWDBST101;User ID=wswebuser;Password=WSDBReader10!;Initial Catalog=WSTechnology");
        SqlCommand cmd = new SqlCommand("sp_AddProduct", cn);
        cn.Open();
        cmd.CommandType = CommandType.StoredProcedure;
        //cmd.Parameters.AddWithValue("@ProductTypeID", 1);
        cmd.Parameters.AddWithValue("@OrganisationID", _OrganisationID);
        cmd.Parameters.AddWithValue("@ProdTypeID", _ProdTypeID);
        cmd.Parameters.AddWithValue("@ProductName", _ProductName);
        cmd.Parameters.AddWithValue("@ProductDescription", _ProductDescription);
        cmd.Parameters.AddWithValue("@ProductComments", _ProductComments);
        cmd.Parameters.AddWithValue("@ProductProfileLocation", _ProductProfileLocation);
        cmd.Parameters.AddWithValue("@ProductMIMEType", _ProductMIMEType);
        cmd.Parameters.AddWithValue("@ProductProfileName", _ProductProfileName);
        cmd.Parameters.AddWithValue("@ProductSerialNumber", _ProductSerialNumber);
        cmd.Parameters.AddWithValue("@CreatedBy", _CreatedBy);
        cmd.Parameters.AddWithValue("@MarkedDelete", _MarkedDelete);
        cmd.Parameters.AddWithValue("@NewProductID", 0);

        return cmd.ExecuteNonQuery(); ;
    }

在Controller GET中:

 // GET: /Products/Create
    [Authorize]
    public ActionResult Create(CreateProductModel createproductmodel)
    {
        DataSet dst = createproductmodel.GetProductsByTypes();
        ViewBag.ProdTypes = dst.Tables[0];

        List<SelectListItem> items = new List<SelectListItem>();

        foreach (System.Data.DataRow dr in ViewBag.ProdTypes.Rows)
        {
            items.Add(new SelectListItem { Text = @dr["Descr"].ToString(), Value = @dr["ProdTypeID"].ToString() });

        }

        ViewBag.ProdTypes = items;

        return View();

和控制器中的POST:

[HttpPost]
    [Authorize]
    [ValidateAntiForgeryToken]
    public ActionResult Create(OrganisationNames organisationnames, CreateProductModel createproductmodel, FormCollection selection, HttpPostedFileBase file)
    {

跳过很多(希望)不重要的代码和

createproductmodel.ProdTypeID = Convert.ToInt32(createproductmodel.SelectedProdType);

                    int _records = createproductmodel.CreateProduct(createproductmodel.OrganisationID, createproductmodel.ProdTypeID, createproductmodel.ProductName, createproductmodel.ProductDescription, createproductmodel.ProductComments, ViewBag.FileURL, ViewBag.MIMEType, ViewBag.FileName, createproductmodel.ProductSerialNumber, createproductmodel.CreatedBy, createproductmodel.MarkedDelete, createproductmodel.NewProductID);

                    return RedirectToAction("Index", "Products");

在视图中:

    <div class="editor-label">      
        @Html.LabelFor(model => model.ProdTypeID)             
    </div>
    <div class="editor-field">
        @Html.DropDownListFor(model => model.SelectedProdType, (IEnumerable<SelectListItem>)ViewBag.ProdTypes, "Select Product Type", new { @class="form-control"})
        @Html.ValidationMessageFor(model => model.ProdTypeID)
    </div>

奇怪的是,DropDownListFor没有涵盖在我拥有的2本MVC4书籍中,而且我无法将Google的任何内容远远地放在我正在尝试的地方附近,并且在搜索StackOverflow时没有任何有用的东西,所以,我我希望有些专家为这个无能的新手提供一个简单的解决方案吗? (还有其他人第一次尝试在MVC中使用DropDownListFor。)

我们非常感谢您解释为什么要返回所选ID,

0 个答案:

没有答案