2014-09-12 64 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")