2014-01-18 55 views
0

我有一个模型,它包含有关帐户(名称,Id等)的一些详细信息,然后它具有一种称为“交易”的类型,该类型包含有关当前所选帐户交易的信息。一笔交易可以有很多交易行。所以我有一个List<TransactionsLine>属性。模型值不可访问

我想设置一个下拉列表的值,使用该模型,该值在列表<>属性中。目前,列表中只能有一项。

@Html.DropDownListFor(x=>x.Transaction.TransactionLines[0].CategoryId, Model.TransactionReferences.Categories, new {@onchange="populateSubCategory()"}) 

但是,当我运行这个时,列表默认为列表中的第一个项目。

在调试模式下,当我将鼠标悬停在x.Transaction.TransactionLines[0].CategoryId上时,它不显示给我一个值。但是当鼠标悬停在集合上时,我看到它有一个有效的列表。它只是不会设置选定的值。

我做错了吗?

它工作在我用其他的下拉菜单,但选择值是在我的模型的最顶层:

@Html.DropDownListFor(x => x.Transaction.ThirdPartyId, Model.TransactionReferences.ThirdParties, new { @class = "cmbThirdParty form-control", @onchange = "populateDefaults()" }) 

那一个正常工作。

注意,做手工,工作原理:

<select class="form-control" id="cmbCategory" onchange="populateSubCategory()"> 
         <option value="0">Select a One</option> 
         @foreach (var cat in Model.TransactionReferences.Categories) 
         { 
          //var selected = cat.Value == Model.Transaction.TransactionLines[0].CategoryId.ToString() ? "selected" : ""; 
          <option value="@cat.Value">@cat.Text</option> 
         } 
        </select> 

但不觉得做到这一点的最好办法。

型号:

传递到视图的主要型号:

public class TransactionModel 
    { 
     public int BankAccountId { get; set; } 
     public string BankAccountName { get; set; } 

     public TransactionContainer Transaction { get; set; } 
     public TransactionReferenceModel TransactionReferences { get; set; } 

     public DateTime DefaultDate { get; set; } 

    } 

的TransactionReferenceModel持有用于填充下拉列表我所有的 '参考' 数据:

public class TransactionReferenceModel 
{ 
    public List<SelectListItem> TransactionTypes { get; set; } 
    public List<SelectListItem> EntryTypes { get; set; } 
    public List<SelectListItem> SubCategories { get; set; } 
    public List<SelectListItem> Categories { get; set; } 
    public List<SelectListItem> ThirdParties { get; set; } 
    public List<SelectListItem> CostCentres { get; set; } 
} 

的TransactionContainer模型拥有关于所选交易的所有主要细节:

public class TransactionContainer 
    { 
     public int Id { get; set; } 
     public int AccountId { get; set; } 

     public int TransactionTypeId { get; set; } 
     public string TransactionType { get; set; } 

     public int EntryTypeId { get; set; } 
     public string EntryType { get; set; } 

     [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/dd/yyyy}")] 
     public DateTime TransactionDate { get; set; } 

     public string ThirdParty { get; set; } 
     public int ThirdPartyId { get; set; } 

     public string Account { get; set; } 

     [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "C2")] 
     public decimal Amount { get; set; } 

     public string Notes { get; set; } 

     public string CategoryDisplay { get; set; } 
     public string CostCentreDisplay { get; set; } 

     public decimal RunningBalance { get; set; } 

     public List<TransactionLine> TransactionLines { get; set; } 

    } 

然后保存组成交易的交易行列表。交易行持有我想设置下拉的财产,这是类别编号:

public class TransactionLine 
{ 

    public int Id { get; set; } 
    public int TransactionId { get; set; } 

    public int? CostCentreId { get; set; } 
    public string CostCentre { get; set; } 

    public int SubCategoryId { get; set; } 
    public string SubCategory { get; set; } 

    public int CategoryId { get; set; } 
    public string Category { get; set; } 

    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "C2")] 
    public decimal Amount { get; set; } 

    public string Notes { get; set; } 

} 

,这里是如何我填充我的模型,并将其发送到视图:

public ActionResult EditTransaction(int? transactionId, int? bankAccountId) 
     { 

      // Create the main view object 
      var model = new TransactionModel 
       { 
        Transaction = new TransactionContainer 
         { 
          TransactionLines = new List<TransactionLine>() 
         } 
       }; 



      if (transactionId != null) // This is an Edit, as opposed to an Add 
      { 
       var item = new TransactionService(currentUserId).GetTransaction(transactionId.Value); 

       // Populate the Reference object used to populate drop downs. 
       model.TransactionReferences = PopulateReferenceDate(model.TransactionReferences, item.TransactionLines[0].SubCategoryId); 

       model.BankAccountId = item.AccountId; 
       model.BankAccountName = item.Account.FullName; 
       model.DefaultDate = Session["DefaultDate"] != null 
             ? DateTime.Parse(Session["DefaultDate"].ToString()) 
             : DateTime.UtcNow; 

       model.Transaction.AccountId = item.AccountId; 
       model.Transaction.Amount = item.Amount; 
       model.Transaction.TransactionLines.Add(new TransactionLine 
        { 
         Id = item.TransactionLines[0].Id, 
         CategoryId = item.TransactionLines[0].SubCategory.CategoryId, 
         CostCentreId = item.TransactionLines[0].CostCentreId, 
         Notes = item.TransactionLines[0].Notes, 
         Amount = item.TransactionLines[0].Amount, 
         SubCategoryId = item.TransactionLines[0].SubCategoryId, 
         TransactionId = model.Transaction.Id 

        }); 
       model.Transaction.EntryTypeId = item.EntryTypeId; 
       model.Transaction.Id = transactionId.Value; 
       model.Transaction.Notes = item.Notes; 
       model.Transaction.ThirdPartyId = item.ThirdPartyId; 
       model.Transaction.TransactionDate = item.TransactionDate; 
       model.Transaction.TransactionTypeId = item.TransactionTypeId; 
      } 
      else 
      { 
       // Populate the bank account details 
       var bank = new BankAccountService(currentUserId).GetBankAccountById(bankAccountId.Value); 
       model.TransactionReferences = PopulateReferenceDate(model.TransactionReferences, null); 

       model.BankAccountId = bank.Id; 
       model.BankAccountName = bank.FullName; 
       model.Transaction.TransactionLines.Add(new TransactionLine 
        { 
         TransactionId = model.Transaction.Id // Link the transaction line to the transaction. 

        }); 

       var transactionDate = Session["DefaultDate"] != null 
              ? DateTime.Parse(Session["DefaultDate"].ToString()) 
              : DateTime.UtcNow; 

       // Populate the object to hold the Transaction data, so that we can use it and return it in the view. 
       model.Transaction.TransactionDate = transactionDate; 

      } 


      return View(model); 


     } 
+0

你能表明该模型的代码? – thepirat000

+0

已添加。希望它是有道理的。我对MVC比较陌生,所以可能走错了路。 – Craig

回答

1

我想你应该在你的视图中使用的SelectList构造函数,以表示默认值,就像这样:

@Html.DropDownListFor(
    x => x.Transaction.TransactionsLines[0].CategoryId, 
    new SelectList(Model.TransactionReferences.Categories, "Value", "Text", Model.Transaction.TransactionsLines[0].CategoryId) 
) 

你并不局限于使用列表< SelectListItem>收集。您也可以使用特定类的列表。

这是控制器的操作方法代码:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     var m = new AccountModel(); 
     m.Transaction = new Transaction(); 
     m.Transaction.TransactionsLines = new List<TransactionsLine>(); 
     m.Transaction.TransactionsLines.Add(new TransactionsLine() { CategoryId = 2 }); 
     m.TransactionReferences = new TransactionReferences(); 
     m.TransactionReferences.Categories = new List<SelectListItem>() 
     { new SelectListItem() { Text = "Cat1", Value = "1" }, 
      new SelectListItem() { Text = "Cat2", Value = "2" }, 
      new SelectListItem() { Text = "Cat3", Value = "3" } 
     }; 
     return View(m); 
    } 
} 
+0

这会产生相同的问题。所选值未被选中。 – Craig

+0

此外,它似乎没有与我将其设置为(CategoryId)属性的问题。我刚刚添加了一个新的属性到我的模型中,将它硬编码为我知道的列表中的值 - 但它仍然将选定的项目设置在下拉列表中。 – Craig

+0

你可以发布分配了CategoryId的控制器代码吗? – thepirat000