2013-07-17 4 views
0

Ребята Я попытался использовать несколько моделей с одним видом.Как связать несколько моделей с одним представлением?

но я не смог найти решение, как его реализовать.

Я хочу использовать One View данные в одинарные прошлом, а другой в другой части ..

я использовал следующий код ..

это один вид

@Html.Partial("Sidebar") 

это другой вид

<!-- start content --> 
    <div id="content"> 
     <div class="post"> 
      <h1 class="title"> 
       Add New Post 
      </h1> 

<p></p> 
      <div class="entry"> 
       @using (Html.BeginForm()) 
       { 
        <div> 
         <div style="display:inline;"> 
          <div style="display: inline; float: left;"> 
           @Html.Label("lblcategory", "Category", new { style = "Width:100px; float: left;" }) 
           <div style="width: 150px; height: 60px; overflow-y: scroll; display: inline; float: left;"> 
            @for (int i = 0; i < (int)TempData["Rows"]; i++) 
            { 
             for (int j = 0; j < (int)TempData["Cols"]; j++) 
             { 
              <input id="Checkbox + @i" name = "Category" type="checkbox" style="width:50px;" value="@TempData["[" + i.ToString() + "][" + j.ToString() + "]"]"/> 
              @TempData["[" + i.ToString() + "][" + j.ToString() + "]"] 
             } 
            }         
            @*@Html.LabelFor(model => model.CategoryName)*@ 
           </div> 
           <div style="float:right;"> 
            <label id="lblcategoryrequired" style="color:Red">@Html.ValidationMessageFor(model => model.CategoryName)</label> 
           </div> 
          </div> 
         </div> 
         <div> 
          <p style="display: inline; float: left;"> 
           @Html.Label("lblsubjet", "Subject", new { style = "Width:100px; float: left;" }) 
           @*@Html.TextBox("txtsubject", "", new { style = "Width:700px;" })*@ 
           @Html.TextBoxFor(model => model.PostSubject, new { style = "Width:400px; maxlength=400;" }) 
           <label id="lblsubjectrequired" style="color:Red">@Html.ValidationMessageFor(model => model.PostSubject)</label> 
          </p> 
         </div> 
         <div> 
          <p style="display: inline; float: left;"> 
           @Html.Label("lblcontent", "Content", new { style = "Width:100px; float: left; Vertical-align:top;" }) 
           @*@Html.TextArea("txtcontent","", new { style = "Width:700px; height:200px; maxlength=700;" })*@ 
           @Html.TextAreaFor(model => model.PostContent, new { style = "Width:400px; height:200px; maxlength=400;" }) 
          </p> 
         </div> 
         <div> 
          <p style="display: inline; float: left;"> 
           @Html.Label("lblblank", "a", new { style = "Width:100px; float: left; Color:#372412" }) 
           <input type="submit" value="Add" id="btnadd" style="width: 100px;" class="button" /> 
           &nbsp&nbsp&nbsp&nbsp 
           <a id="Cancel" href="~/Home/Home"> <input type="button" value="Cancel" id="btncancel" class="button" style="width: 100px;" /></a> 
          </p> 
         </div> 
        </div> 
        @Html.ValidationSummary(true) 
       } 
      </div> 
     </div> 
    </div> 
</div> 
+1

Вы можете иметь ViewModel, который имеет обе модели, и вы можете связать это с вашей точки зрения –

ответ

0

Следует использовать модель представления, которая представляет данные, необходимые для просмотра. Вы можете либо подвергнуть модели непосредственно модели представления (нарушая LoD), либо делегировать вызовы модели представления на основные модели (нарушая принцип DRY).

+0

Я. чувак, я использовал модель как @model BloginMVC.Models.PostModel @ { ViewBag.Title = «AddPost»; Layout = "~/Views/MasterView/MasterLayout.cshtml"; }, но он не подходит для ссылки на метод GET PartialView i.e.Sidebar ... –

+0

«он не идет, чтобы ссылаться на метод GET» - я не знаю, что вы подразумеваете под этим. Если вы хотите передать модель до частичного, то вы можете использовать, например. @ Html.Partial («Боковая панель», model.SidebarModel). См. Http://msdn.microsoft.com/en-us/library/ee402926(v=vs.108).aspx – devdigital

+0

Я просто хочу сказать, что я использую One View для отображения данных в двух частях.В левой части я хочу отображать данные из PartialView, в которых я использовал 1 модель и в другом разделе. Я хочу отображать данные из того же представления, в котором я использовал другую модель, но проблема в том, что при загрузке представления он вызывает метод ActionResult типа GET представления, но когда он обрабатывает PartialView, он не вызывает метод ActionResult типа GET Partialview и дает ошибку, такую ​​как ссылка объекта, не установленная в экземпляр объекта для модели, который я использовал в частичном представлении. –

1

Я не понимаю ваш вопрос 100%. Но если бы я понял это, я не думаю, что это будет работать так, как вам нужно, чтобы работать (я мог ошибаться). Я бы посоветовал вам отойти от частичного просмотра и просто передать один view model, который вы можете использовать для заполнения обоих разделов. Представленные модели могут представлять ваши данные в представлении.

Я собираюсь дать вам базовый образец, который вы можете изменить и использовать в своем сценарии. Допустим, у нас есть клиент, и у этого клиента может быть 1 или несколько адресов. Таким образом, основное представление этих 2 моделей может выглядеть следующим образом:

public class Customer 
{ 
    public int Id { get; set; } 

    public string FirstName { get; set; } 

    public string LastName { get; set; } 

    public IEnumerable<Address> Addresses { get; set; } 
} 

public class Address 
{ 
    public int Id { get; set; } 

    public string AddressLine1 { get; set; } 

    public string AddressLine2 { get; set; } 

    public string AddressLine3 { get; set; } 
} 

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

public ActionResult Details(int id) 
{ 
    Customer customer = customerRepository.GetById(id); 

    if (customer != null) 
    { 
      customer.Addresses = addressRepository.GetAddressesForCustomer(customer.Id); 
    } 

    // The above 2 steps can be done in 1 repository call 

    // Now populate your view model with the above details 
    // This can also be 1 or 2 lines when you use something like Auto Mapper 

    CustomerDetailsViewModel viewModel = new CustomerDetailsViewModel 
    { 
      viewModel.CustomerId = customer.Id, 
      viewModel.CustomerFirstName = customer.FirstName, 
      viewModel.CustomerLastName = customer.LastName, 
      viewModel.CustomerAddresses = customer.Addresses 
    }; 

    return View(viewModel); 
} 

Ваше мнение Модель:

public class CustomerDetailsViewModel 
{ 
    public int CustomerId { get; set; } 

    public string CustomerFirstName { get; set; } 

    public string CustomerLastName { get; set; } 

    public IEnumerable<Address> CustomerAddresses { get; set; } 
} 

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

@model YourProject.ViewModels.Customers.CustomerDetailsViewModel 

@Model.CustomerId<br /> 
@Model.CustomerFirstName<br /> 
@Model.CustomerLastName<br /><br /> 

@foreach (var address in @Model.CustomerAddresses) 
{ 
    <div> 
      @address.Id<br /> 
      @address.AddressLine1<br /> 
      @address.AddressLine2<br /> 
      @address.AddressLine3<br /> 
    </div> 
} 

Надеюсь, это поможет.

+0

+1 Поверьте, что я буду делать. –

+0

Спасибо, Брендан .. Это определенно поможет мне ... Теперь у меня есть настоящая идея. –

+0

Тогда отметьте это как принятый ответ :) –

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