我有一个MVC4应用程序,虽然我从数据库中获取了DropDownList的参数,但在将DropDownList值发布到数据库时遇到了一些问题。有很多样本用于不同的方法,但我想应用一种方法而不使用额外的方法,即Ajax,Javascript等。另一方面,我遇到了“FormCollection”传递数据,但我不确定如果FormCollection是这个场景中的最佳方式。以下是我使用的视图,控制器和模型的一部分:
查看:
@using (Html.BeginForm("Add", "Product", FormMethod.Post,
new { enctype = "multipart/form-data" }))
{
<p>Product Type : @Html.DropDownListFor(m => m.SelectedLookupId, new SelectList(Model.Lookups.Where(x => x.LookupType == "Product Type"), "LookupID", "LookupValue"), "--- Select ---") </p>
控制器:
[HttpPost]
public ActionResult Add(Product product)
{
if (ModelState.IsValid)
{
product.ProductType = // ??? Cannot get the SelectedLookupId
...
repository.SaveProduct (product);
TempData["message"] = string.Format("{0} has been saved", product.Name);
return View("Completed");
}
else
{
//there is something wrong with the data values
return View(product);
}
}
视图模型:
public class ProductViewModel
{
public IEnumerable<Product> Products { get; set; }
public IEnumerable<Lookup> Lookups { get; set; } //Lookup for Product Types
public int SelectedLookupId { get; set; }
public Product Product { get; set; }
}
提前感谢您的帮助。
答案 0 :(得分:0)
您的操作方法应该是接收视图模型,而不是产品本身,如下所示:
[HttpPost]
public ActionResult Add(ProductViewModel productViewModel)
除非我感到困惑。但我假设您在上面发布的视图片段来自“添加”视图,该视图的模型类型为ProductViewModel
。在您的操作方法中,当模型状态无效时,您将返回“添加”视图,但是您将Product
传递给该视图。我可能会感到困惑,因为这会给你一个类型不匹配的运行时错误。
答案 1 :(得分:0)
感谢您的回复。实际上通过使用ViewModel而不是View,我设法解决了这个问题。另一方面,经过一些研究,我已经应用了另一种有效的方法,以便在不需要ViewModel的情况下填充Dropdownlist。此外,在这个例子中,我可以在同一个Lookup表上使用多个外键,如下所示。这是一个申请人实体,具有3个外键和与这些键相关的查找实体。我想用这个例子实现的只是使用Lookup表只有几个Dropdownlist参数,即Gender,Yes / No,Status,...因为不需要为几个参数创建一个表(这些参数是区分的< Lookup表上的strong> LookupType 属性)。以下是完整的示例(我简短地说明了不相关的属性):
申请人实体:
public class Applicant
{
[Key]
public int ApplicantID { get; set; }
public string Name { get; set; }
public string Surname { get; set; }
// for using "Multiple foreign keys within same table using Fluent API"
public int? HasDoneAnyProject { get; set; }
public int? IsInterestedAnyProgramme { get; set; }
public int? InterestedProgrammeId { get; set; }
public virtual Lookup PrimaryLookup { get; set; }
public virtual Lookup SecondaryLookup { get; set; }
public virtual Lookup TertiaryLookup { get; set; }
}
查找实体:
public class Lookup
{
[Key]
public int LookupID { get; set; }
public string LookupType { get; set; }
public string LookupValue { get; set; }
// for using "Multiple foreign keys within same table using Fluent API"
public virtual ICollection<Applicant> PrimaryLookupFor { get; set; }
public virtual ICollection<Applicant> SecondaryLookupFor { get; set; }
public virtual ICollection<Applicant> TertiaryLookupFor { get; set; }
}
<强>的DbContext:强>
public class EFDbContext : DbContext
{
public DbSet<Applicant> Applicants { get; set; }
public DbSet<Lookup> Lookups { get; set; }
//for using "Multiple foreign keys within same table using Fluent API"
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Applicant>()
.HasOptional(b => b.PrimaryLookup)
.WithMany(a => a.PrimaryLookupFor)
.HasForeignKey(b => b.HasDoneAnyProject)
.WillCascadeOnDelete(false);
modelBuilder.Entity<Applicant>()
.HasOptional(b => b.SecondaryLookup)
.WithMany(a => a.SecondaryLookupFor)
.HasForeignKey(b => b.IsInterestedAnyProgramme)
.WillCascadeOnDelete(false);
modelBuilder.Entity<Applicant>()
.HasOptional(b => b.TertiaryLookup)
.WithMany(a => a.TertiaryLookupFor)
.HasForeignKey(b => b.InterestedProgrammeId)
.WillCascadeOnDelete(false);
}
}
<强>控制器:强>
private void PopulateLookupsDropDownList(string lookupType, string foreignKey, object selectedLookups = null)
{
var lookupsQuery = repository.Lookups
.Select(x => x)
.Where(x => x.LookupType == lookupType)
.OrderBy(x => x.ParentLookupID).ToList();
ViewData[foreignKey] = new SelectList(lookupsQuery, "LookupID", "LookupValue", selectedLookups);
}
并为三个Dropdownlist中的每一个调用Method:
PopulateLookupsDropDownList("YesNo", "HasDoneAnyProject", applicant.HasDoneAnyProject);
PopulateLookupsDropDownList("YesNo", "IsInterestedAnyProgramme", applicant.IsInterestedAnyProgramme);
PopulateLookupsDropDownList("Programme", "InterestedProgrammeId", applicant.InterestedProgrammeId);
查看::使用不同的LookupType参数从同一个查找表中填充三个Dropdownlist中的每一个:
<label>Has done any project before?</label>
@Html.DropDownList("HasDoneAnyProject", "---- Select ----")
<label>Are you interested in any programme?</label>
@Html.DropDownList("IsInterestedAnyProgramme", "---- Select ----")
<label>Interested programme name?</label>
@Html.DropDownList("InterestedProgrammeId", "---- Select ----")
我希望这种方法对那些想要从同一个Lookup表中填充Dropdownlists的人有用。另一方面,它不仅适用于此,也可用于填充不同表格中的下拉列表
问候。