2014-09-12 35 views
0

我是ASP.NET MVC的新手,并且/我不确定如何将我的问题转化为字面意思。我必须创建一个页面,用户可以在贷款申请中添加多个附属物品清单。每“行”为每个抵押品的项目需要几个下拉列表选择是基于一个ViewModel抵押品的类型,其类等页:DropDownListFor ViewModel中集合的属性

public class CollateralViewModel 
{ 
    public Guid LoanApplicationId { get; set; } 
    public IEnumerable<CollateralRowViewModel> Collateral { get; set; } 
} 

了IEnumerable抵押品得到如下:

public class CollateralRowViewModel 
    { 
     public Guid Id { get; set; } 

     public Guid LoanApplicationId { get; set; } 

     public IEnumerable<SelectListItem> CollateralClass { get; set; } 
     public IEnumerable<SelectListItem> CollateralType { get; set; } 

     public Guid SelectedCollateralType { get; set; } 
     public Guid SelectedCollateralClass { get; set; } 

     [DataType(DataType.MultilineText)] 
     public string Description { get; set; } 

     public decimal? MarketValue { get; set; } 
     public decimal? PriorLiens { get; set; } 
     public decimal? AdvanceRate { get; set; } 

     public string GrantorFirstName { get; set; } 
     public string GrantorMiddleName { get; set; } 
     public string GrantorLastName { get; set; } 
    } 

我的控制器看起来是这样的:

public async Task<ActionResult> Create(CollateralViewModel collateralViewModel) 
     { 
      var collateralServiceProxy = base.ServiceProvider.CollateralServiceProxy; 
      var collateralTypes = await GetCollateralTypesByClass(Guid.NewGuid()); 

      var selectedCollateral = collateralViewModel.Collateral.Select(collateral => new Collateral() 
      { 
       Id = collateral.Id, 
       LoanApplicationId = collateral.LoanApplicationId, 
       CollateralTypeId = collateral.SelectedCollateralType, 
       Description = collateral.Description, 
       GrantorFirstName = collateral.GrantorFirstName, 
       GrantorMiddleName = collateral.GrantorMiddleName, 
       GrantorLastName = collateral.GrantorLastName, 
       PriorLiens = collateral.PriorLiens, 
       MarketValue = collateral.MarketValue 
      }); 

      foreach (var collateral in selectedCollateral) 
      { 
       await collateralServiceProxy.PutCollateralAsync(collateral); 
      } 
      return View(collateralViewModel); 
     } 

     private async Task<IEnumerable<SelectListItem>> GetCollateralClasses() 
     { 
      var collateralServiceProxy = base.ServiceProvider.CollateralServiceProxy; 
      var collateralClasses = await collateralServiceProxy.GetAllCollateralClassesAsync(); 

      if (collateralClasses == null) 
      { 
       return new List<SelectListItem>(); 
      } 
      return collateralClasses.ToSelectList(); 
     } 

     private async Task<IEnumerable<SelectListItem>> GetCollateralTypesByClass(Guid collateralClassId) 
     { 

      var allCollateralTypes = await GetAllCollateralTypes(); 
      var selectedCollateralTypes = allCollateralTypes.Where(collateralType => Guid.Parse(collateralType.Value).Equals(collateralClassId)); 

      return selectedCollateralTypes; 
     } 

当我尝试使用@ Html.DropDownListFor(型号=> model.Collat​​eral.Collat​​eralClasses)我不能因为Collat​​eralClasses不可用。 I型“(model.Collat​​eral。”和属性不存在。我在做什么错在这里?

任何帮助是极大的赞赏!

+0

model.Collat​​eral是IEnumerable 。它就像一个集合。首先你不能像model.Collat​​eral.Collat​​eralClasses一样使用这个,必须有一些“FirstOrDefault”来从单个对象中选择属性。第二个也是最重要的问题是,您的Collat​​eralClasses属性在哪里?我无法在模型中找到它 – 2014-09-12 13:15:58

+0

Collat​​eralClass属性在Collat​​eralRowViewModel中作为IEnumerable Collat​​eralClass。 – BeeDev 2014-09-12 13:26:08

+0

好吧,明白了。我正在用“Collat​​eralClasses”搜索它。如果问题出现在@ Html.DropDownListFor(model => model.Collat​​eral.Collat​​eralClass)中,那么它将显示@ Html.DropDownListFor(model => model.Collat​​eral.FirstOrDefault()。Collat​​eralClasses)的建议。让我知道它是否有效 – 2014-09-12 13:27:21

回答

0

的问题是你的下拉列表渲染UI时,不填充你必须正确地填充下拉列表之前渲染data.This可以通过多种方式来实现,但我会建议阅读下面的文章。

article您的问题

http://odetocode.com/blogs/scott/archive/2013/03/11/dropdownlistfor-with-asp-net-mvc.aspx

提供解决方案

希望这会有所帮助。

+0

感谢您的建议,但本文不直接解决我的问题。我无法访问创建下拉菜单所需的属性,因为我的模型的设置与文章中的示例不同。我很感激你的帮助。 – BeeDev 2014-09-12 13:56:21

1

请检查你的dropdownlistfor syntex。我认为这可能是问题(因为你没有指定的错误)。请检查了Syntex

@Html.DropDownListFor(m => m.ContribType, 
       new SelectList(Model.ContribTypeOptions, 
           "ContribId", "Value", 
           Model.ContribTypeOptions.First().ContribId)) 

,所以你可以尝试一下这样的。在您的第一个“valueItRepresent”中,它应该是属性的下拉列表。

@Html.DropDownListFor(model => model.valueItRepresent, model.Collateral.FirstOrDefault().CollateralClasses‌ as SelectList, "Select")