0


我有一个 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; }
}


提前感谢您的帮助。


4

2 回答 2

0

您的操作方法应该接收视图模型,而不是 Product 本身,如下所示:

[HttpPost]
public ActionResult Add(ProductViewModel productViewModel)

除非我很困惑。但我假设您在上面发布的视图片段来自 Add 视图,并且该视图的模型是 type ProductViewModel。在您的操作方法中,当模型状态无效时,您将返回 Add 视图,但是您将 a 传递Product给该视图。我可能会再次感到困惑,因为这应该会给您一个类型不匹配的运行时错误。

于 2013-08-17T19:42:38.183 回答
0

谢谢您的回复。实际上,通过使用 ViewModel 而不是 View,我已经设法解决了这个问题。另一方面,经过一些研究,我应用了另一种有效的方法来填充下拉列表而不需要 ViewModel。此外,在此示例中,我可以在同一个查找表上使用多个外键,如下所示。这是一个具有 3 个外键和与这些键相关的查找实体的申请人实体。我想用这个例子实现的正是对几个 Dropdownlist 参数使用 Lookup 表,即 Gender、Yes/No、Status...,因为不需要为几个参数创建表(这些参数是不同的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; }     
} 


数据库上下文:

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);
}

并为三个下拉列表中的每一个调用方法:

PopulateLookupsDropDownList("YesNo", "HasDoneAnyProject", applicant.HasDoneAnyProject);
PopulateLookupsDropDownList("YesNo", "IsInterestedAnyProgramme", applicant.IsInterestedAnyProgramme);
PopulateLookupsDropDownList("Programme", "InterestedProgrammeId", applicant.InterestedProgrammeId);


查看: : 使用不同的 LookupType 参数从同一个 Lookup 表中填充三个 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 ----")


我希望这种方法对那些想从同一个查找表中填充下拉列表的人有用。另一方面,它不仅适用于此,还可以用于填充来自不同表的下拉列表。
问候。

于 2013-10-18T22:02:57.313 回答