2013-04-30 2 views
0

У меня есть следующие классыAdvance Связывание в MVC

public class Lookup 
{ 
    public int Id { get; set; } 
    public string Description { get; set; } 
    ... 
} 

public class AccountTypeLookUp: Lookup 
{  
    ... 
} 

[Serializable] 
public class Account 
{ 
    [HiddenInput] 
    public int AccountId { get; set; } 
    [Required, Display(Name="Account Name", Order=1)] 
    public string AccountName { get; set; } 
    [Display(Name="Account Description", Order=2)] 
    public string AccountDescription { get; set; } 
    [Required, Display(Name="Institution Name")] 
    public string InstitutionName { get; set; } 
    [Required, Display(Name="Account Number"), RegularExpression(@"[0-9]+",ErrorMessage="{0} can only be digits")] 
    public string AccountNumber { get; set; } 
    [Display(Name = "Routing Number"), RegularExpression(@"[0-9]+", ErrorMessage = "{0} can only be digits")] 
    public string RoutingNumber { get; set; } 
    [Required, Display(Name = "Account Type")] 
    public AccountTypeLookup AccountType { get; set; } 
    [ScaffoldColumn(false)] 
    public List<Transaction> TransactionCollection { get; set;} 

    public Account() 
    { 
     AccountId = default(int); 
     TransactionCollection = new List<Transaction>(); 
    } 

Теперь на мой взгляд, у меня есть выпадающий, который отображает описание Тип учетной записи со значениями, равными Id

<select class="input-validation-error" data-val="true" data-val-required="The Account Type field is required." id="AccountType" name="AccountType"> 
<option value="1">Savings</option> 
<option selected="selected" value="2">Checking</option> 
<option value="3">CreditCard</option> 
</select> 

Теперь, как я могу связать, что COMBOBOX к моей локальной переменной

account.AccountType.Id =? 

Мой метод подписи

[HttpPost] 
    public ActionResult Create(Account account) 

В настоящее время я получаю сообщение об ошибке «Значение« 2 »недействительно». что имеет смысл, так как он ищет сложный тип.

ответ

2

У вас есть два варианта. Первый вариант сделать это так, как вы делаете это сейчас, и это не с помощью HTML-помощника:

<select class="input-validation-error" data-val="true" data-val-required="The Account Type field is required." id="AccountType" name="AccountType"> 
<option value="1">Savings</option> 
<option selected="selected" value="2">Checking</option> 
<option value="3">CreditCard</option> 
</select> 

Но вы должны изменить id и name к следующему. Но учтите, что у AccountType не будет описания с ним. Поскольку вы можете привязываться только к одному свойству из comboxbox, и это будет связано с свойством Id.

id="AccountType_Id" name="AccountType.Id" 

Ваш второй вариант является использование DropDownListFor поэтому вы гарантированно, что связывание работает хорошо. Вы должны создать selectlistitem, хотя, как в контроллере, так и в представлении, лучшая практика диктует, что вы создаете его в контроллере и передаете его вашему представлению. Таким образом, вы можете иметь что-то вроде:

@Html.DropDownListFor(m => m.AccountType.Id, Model.AccountTypes) 

модели, хотя это ViewModel, которые могут быть отображены на ваш Account класса. Если вы не хотите использовать viewmodel и используете Account прямо на ваш взгляд, вам нужно создать список (Model.AccountTypes) в ViewBag. Затем вам необходимо изменить DropDownListFor:

@Html.DropDownListFor(m => m.AccountType.Id, 
    (IEnumerable<SelectListItem>)ViewBag.AccountTypes) 

// you might be pulling these values from a database, 
// this is just an example of how you will build the list in the controller, 
// you might build this in a for-loop, foreach or linq 
ViewBag.AccountTypes = new List<SelectListItem> { 
      new SelectListItem { Value = "1", Text="Savings"}, 
      new SelectListItem { Value = "2", Text="Checking"}, 
      new SelectListItem { Value = "3", Text="CreditCard"}, 
     }; 
+0

Я использовал html-помощник. Я просто указал на m.AccountType вместо m.AccountType.Id – Mike

1

Я думаю, MVC модель привязки знает, чтобы связать строку запроса Controller/Create?accountType.id=3 в account.AccountType.Id = 3

Так попробуйте изменить

<select class="input-validation-error" data-val="true" data-val-required="The Account Type field is required." id="AccountType" name="AccountType">

в

<select class="input-validation-error" data-val="true" data-val-required="The Account Type field is required." id="AccountType_Id" name="AccountType.Id">

Смотрите раздел рекурсивная модель связывания здесь: http://msdn.microsoft.com/en-us/magazine/hh781022.aspx

+0

Спасибо за статью. – Mike

Смежные вопросы