2013-04-25 1 views
2

поэтому я работаю в проекте asp.net mvc 4, и у меня есть проблема, на мой взгляд, то, что я хочу, это создать представление с 2 разными типами моделей, первый вид (индекс) принимает IEnumerable (Models.myModel) второй (абонентская подробности) принять Models.myModel, это мой код модели:Как создать представление с несколькими моделями mvc 4?

public class SubscribersModel 
{ 

    [Required] 
    [DataType(DataType.Text)] 
    public string name { get; set; } 

    [Required] 
    [DataType(DataType.Text)] 
    [StringLength(maximumLength: 10, MinimumLength = 7)] 
    public string cin { get; set; } 

    [Required] 
    [DataType(DataType.Date)] 
    public DateTime birthday { get; set; } 

    [DataType(DataType.Text)] 
    public string birthplace { get; set; } 
    } 

Мой код контроллера:

public class SubscribersController : Controller 
{ 
    private AgencyDbEntities dbcontext = new AgencyDbEntities(); 
    private Subscribe sb = new Subscribe(); 

    public ActionResult Index() 
    { 
     var subscribers = from sb in dbcontext.Subscribes select new SubscribersModel {  cin = sb.cin, name = sb.name, birthday = (DateTime)sb.birthDay, birthplace = sb.birthPlace }; 

     return View(subscribers); 
    } 

    public ActionResult Details(string id,string cin,string name) 
    { 
     var subscriber = new SubscribersModel(); 
     IEnumerable<Subscribe> list = from s in dbcontext.Subscribes select s; 
     foreach (var sb in list) 
     { 
      if (sb.cin == id) 
      { 
       subscriber.cin = sb.cin; 
       subscriber.name = sb.name; 
       subscriber.birthday = (DateTime)sb.birthDay; 
       subscriber.birthplace = sb.birthPlace; 
      } 
     } 
     return View(subscriber); 
    } 
} 

мой взгляд индекс:

@model IEnumerable<_3SDWebProject.Models.SubscribersModel> 

@{ 
    ViewBag.Title = "Subscribers"; 
} 
    <div class="sidebar"> 
     //here i want to show my details view 
    </div> 
<div class="content" style="width: 700px; margin-left: 250px; height: 545px;margin- top: -30px;"> 
    <h2>Subscribers</h2> 
<p> 
    @Html.ActionLink("Create New", "Create") 
</p> 

@Styles.Render("~/Content/css") 
<script src="@Url.Content("~/Scripts/Table.js")" type="text/javascript"></script> 
<table class="altrowstable" id="alternatecolor"> 
<tr> 
    <th> 
     CIN 
    </th> 
    <th> 
     Name 
    </th> 
    <th> 
     birthday 
    </th> 
    <th> 
     birthplace 
    </th> 
    <th class="operations"> 
     Operations 
    </th> 
</tr> 

@foreach (var item in Model) 
{ 
<tr> 
    <td> 
     @Html.DisplayFor(modelItem => item.cin) 
    </td> 
    <td> 
     @Html.DisplayFor(modelItem => item.name) 
    </td> 
    <td> 
     @Html.DisplayFor(modelItem => item.birthday) 
    </td> 
    <td> 
     @Html.DisplayFor(modelItem => item.birthplace) 
    </td> 
    <td> 
     @Html.ActionLink("Details", "Details", new { id = item.cin }, new { @class = "details-logo"}) 
    </td> 
</tr> 
} 

</table> 
</div> 

мои детали просмотра:

@model _3SDWebProject.Models.SubscribersModel 

<fieldset> 
<legend>SubscribersModel</legend> 

<div class="display-label"> 
    @Html.DisplayNameFor(model => model.name) 
</div> 
<div class="display-field"> 
    @Html.DisplayFor(model => model.name) 
</div> 
<div class="display-label"> 
    @Html.DisplayNameFor(model => model.birthday) 
</div> 
<div class="display-field"> 
    @Html.DisplayFor(model => model.birthday) 
</div> 

<div class="display-label"> 
    @Html.DisplayNameFor(model => model.birthplace) 
</div> 
<div class="display-field"> 
    @Html.DisplayFor(model => model.birthplace) 
</div> 
</fieldset> 

так, пожалуйста, если кто-то есть какие-либо идеи или решения, я буду очень признателен: NB: это картина описать то, что я хочу enter image description here

+1

Вид должен быть связан только с одной моделью. Вы можете объединить обе модели в одну и использовать эту комбинированную модель в представлении. – Flavia

+0

Я бы не согласился с этим. Взгляд может очень хорошо, а иногда и должен быть связан с таким количеством моделей, сколько необходимо. Вот почему я использую то, что я называю «View Model» (даже если это не совсем правильно), класс между моделями и представлением, чтобы создать правильное в структуре памяти, которое будет передано в представление. Но это никак нельзя назвать «моделью». Помните, что если вы используете EF Code First, создание новой «комбинированной» модели фактически приведет к созданию новой таблицы в вашей базе данных. Я сомневаюсь, что это цель .... – BernardG

ответ

9

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

public class CompoundViewModel 
{ 
    public IEnumerable<SubscribersModel> AllSubscribers {get; set;} 
    public SubscribersModel SelectedSubscriber {get; set;} 
} 

В идеале также разделить свой вид в частичный вид и сделать эти две части вашего соединения модели в них с помощью DisplayFor<> или EditorFor<>. Таким образом, вы можете повторно использовать представление для «SubscriberModel» в другом месте приложения, если вам это нужно.

Ваш код контроллера также можно улучшить, используя инфраструктуру инъекции зависимостей (например, Autofac), чтобы ввести те зависимости, которые вы сейчас обновляете.

Другая альтернатива, учитывая, что вы используете ту же модель для списка и представления деталей, будет обрабатывать эту клиентскую часть с помощью Javascript либо вручную с помощью jQuery, либо с помощью одной из новых фреймворков, которая позволяет на стороне клиента например, Knockout.js или Angular.js.

+0

Спасибо @lan, он отлично работает, я создаю класс, содержащий две модели. – Mohammadov

0

Вам просто нужно создать второе представление под названием Details, которое строго типизировано с помощью SubscribersModel

@model _3SDWebProject.Models.SubscribersModel 

для Details() действия
Выберите Добавить View для просмотра имени правой кнопкой мыши в любом месте в коде ...
Оставить «Подробности»
Check «Создание строго типизированной»
Выберите SubscribersModel из класс Model выпадающих
шаблон Леска: Детали
Нажмите кнопку «Добавить»

+0

Я уже делаю это проблема: я не могу работать с двумя разными типами моделей в одном и том же представлении – Mohammadov

+0

Упс, я вижу левую часть вашего SS. – Rohrbs

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