我正在尝试在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,