2015-03-14 3 views
1

Я новичок в ASP.NET MVC, и я хочу создать представление, где я могу создать новый объект вместе со связанными объектами.ASP.NET MVC Создание объекта со связанным объектом в одном представлении

В качестве примера: у меня есть следующий класс Person:

public class Person 
{ 
    public int PersonId { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 

    public virtual List<Address> Addresses { get; set; } 
} 

и класс Адрес:

public class Address 
{ 
    public int AddressId { get; set; } 
    public string City { get; set; } 
    public string Street { get; set; } 

    public int PersonId { get; set; } 
    public virtual Person Person { get; set; } 
} 

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

Моя первая (простая) попытка состояла в том, чтобы просто обеспечить ссылку на действие, которая сопоставляется с методом контроллера. Этот метод принимает объект Person как параметр, добавляет объект Address в коллекцию Addresses и возвращает новое представление create (может быть, это не приятно, но это сработало). Но когда я попытался добавить второй адрес, я заметил, что коллекция адресов Person снова была пуста.

Любые sugesstions/лучшие практики для такого рода проблем?

Спасибо!

+0

Так вы знаете, что-то не так с вашим кодом, но вы не собираетесь на самом деле показать нам код? – mason

+0

Некоторые варианты динамического добавления объектов в коллекцию показаны в [этом ответе] (http://stackoverflow.com/questions/28019793/submit-same-partial-view-called-multiple-times-data-to-controller/ 28081308 # 28081308) –

ответ

0

Я хотел бы предложить Вам следующий подход:

1.Create представлен вид модели:

public class AddressViewModel 
{ 
    public string City { get; set; } 
    public string Street { get; set; } 
} 

public class PersonViewModel() 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public AddressViewModel AddressViewModelTemplate {get; set;} 
    public Collection<AddressViewModel> Addresses {get; set;} 
} 

Затем на ваш взгляд, вы можете использовать скрытые EditorTempalete для AddressViewModelTemplate, и показать его с JavaScript на некоторых нажмите кнопку. Конечно, вам нужно будет скорректировать имена созданной коллекции для привязки.

Шаблон редактора шаблонов. Вы можете выбрать лучшую структуру.

@model AddressViewModel 
    <div> 
     <div>@Html.LabelFor(x => x.City)</div> 
     <div>@Html.TextBoxFor(x => x.City)</div> 
    </div> 
    <div> 
     <div>@Html.LabelFor(x => x.Street)</div> 
     <div>@Html.TextBoxFor(x => x.Street)</div> 
    </div> 

в вашем сильно типизированных:

@model PersonViewModel; 
@using(Html.BeginForm()) 
{ 
    //Display textbox for Person properties here 
    .... 
    <div id="addressInfo" style:"dislpay:none"> 
     @Html.EditorFor(x => x.AddressViewModelTemplate) 
    </div> 
    .... 
    <div id="AddressesWraper"> 
     <input id="btnAddAddress" type="button" value="Add new Address" /> 
    <div> 
} 
<script> 
    $(document).ready(function(){ 
     $("#btnAddAddress").click(function(){ 
      $("#AddressesWraper").append("#addressInfo").html(); 
      refreshAddressNames(); 
     }); 
    }); 
    function refreshAddressNames(){ 
     /*Here you should name your addresses like this: 
      name="AddressViewModel.Addresses[0].City" 
      name="AddressViewModel.Addresses[0].Street" 
      name="AddressViewModel.Addresses[1].City" 
      name="AddressViewModel.Addresses[1].Street" 
      ................................[2].City" 
              [2].Street" 

     If you want delete option, you have to mind that too and reorder the collection propely*/ 
    } 
</script> 
+0

Это, кажется, лучшее решение, чем отправка запроса контроллеру все время, спасибо! – 3xtracrispy

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