2015-03-23 2 views
-1

У меня есть класс Контакты:Radioboxfor модель связывания с классом

public class Contact 
{ 
    public int Id { get;set; } 
    public Boolean DefaultYN {get;set; } 
    public string AdrType { get; set; } 
    public string Street {get; set; } 
    public string Town {get; set; } 
    public string HouseNr { get; set; } 
    public string PostCd { get; set; }  
} 

У меня есть VieModel

public class ContactVm 
{ 
    public Contact SelectedContact { get; set; } 
    public Contact SelectedInvoiceContact { get;set; } 
    public List<Contact> ContactList { get; set; } 
} 

У меня сильно - typped Посмотреть

@model MvcBeaWeb.Models.ContactVm 
<!-- Address Div --> 
@using (Html.BeginForm("Index", "OrderSummary")) 
{ 
    <div id="deliveryAddressTab" class="deliveryAddressTab" style="margin: 10px 3px;"> 
    @foreach (var item in Model.ContactList) 
    {        
     <div style="display: inline-block; float: left;"> 
     @Html.RadioButtonFor(x => x.SelectedContact, item, new {@checked = true ,id = "item" + item.Id }) 
     </div> 
     <div id="@item.Id" style="float: left; margin-left: 10px; font-weight: 500;"> 
     <span class="spnTown">@item.PostCd @item.Town</span> 
     </div>     
    } 
    </div> 
} 

Итак, вы видите, что для каждого Contact от ContactList Я создаю один радиобудильник для SelectedContact эл. Но так как это сложный тип (контактный объект) при нажатии на кнопку входа, и я переходите к индексу действия моего контроллера OrderSummary

public ActionResult Index (ContactVm contactVm) 
{ 
    /* .... */ 
} 

мой параметр contactVm пуст и модель связывания, кажется, не работает

+0

по умолчанию это зовет Get Функция для вашего действия вы можете украсить свой метод действия с HttpPost и использованием FormMethod.Post в Html.BeginForm («Индекс», «OrderSummary»). –

+0

Вы не можете привязать переключатель (или любой другой элемент управления) к сложному объекту. И почему вы устанавливаете '@checked = true', что означает, что всегда будет выбран последний переключатель. –

+0

Используйте @using (Html.BeginForm (« Index »,« OrderSummary », FormMethod.Post)), и, как сказал Stephen, вы не можете относятся к сложному объекту – Vinod

ответ

1

Модель Binder не имеет достаточной информации для регидратации класса Contact. Для каждого свойства ViewModel должно быть значение, предоставленное в запросе (например, формы, querystring и т. Д.), Чтобы связать всю модель, поэтому в вашем примере это не сработает.

Я предполагаю, что вы загружаете список контактов из хранилища. (Например, DB)

Я бы выставить свойство на ViewModel для SelectedContactId и использовать это в качестве метода RadioButtonFor, и использовать идентификатор контакта в списке будет значение кнопки радио:

Html.RadioButtonFor(m => m.SelectedContactId, item.Id) 

Затем при загрузке с вашей точкой зрения модели, вы можете загрузить контакты обратно из хранилища, а также найти контакт по ID

+0

Да, в первый раз я сделал это таким же образом. Проблема в том, что мне нужно отдельно от идентификатора адреса, который мне нужен, и AdrType (счет-фактура, доставка). Итак, как вы думаете, как я могу это достичь! Возможно ли связать эту радиоблоку так или иначе связанную с этими двумя свойствами. Каковы скорректированные способы достижения этого. –

+0

Не знаете, что вы имеете в виду с помощью Addresstype, это выбор для пользователя? Я бы спросил, это еще один вопрос и дать более подробную информацию. –

+0

Вы видите, что мой класс Contact имеет два свойства public class Контакт - Id {get; set; } и свойство AdrType {get; задавать; }; Каким-то образом переключатель должен быть подключен к этим двум свойствам. –

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