Объединение двух видов с разными моделями - PullRequest
0 голосов
/ 31 августа 2011

Привет всем, я не уверен, как это сделать. У меня есть два вида с двумя отдельными моделями, я хотел бы объединить два, чтобы они оба были в одном представлении.

Вид 1:

@model IEnumerable<TelephoneNumberManagement.Models.Range>

<table>
    <tr>
        <th>
            RangeName
        </th>
        <th>
            RangeNumber
        </th>
    </tr>

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.ActionLink(item.RangeName, "ViewSubRange", new { id = item.ID })
        </td>
        <td>
            @item.RangeNumber
        </td>
    </tr>
}
</table>

Просмотр 2: -

@model IEnumerable<TelephoneNumberManagement.Models.TestNumber>
<h2>Index</h2>

<table>
    <tr>
        <th>
            Number
        </th>
        <th>
            Status
        </th>
        <th>
            Customer
        </th>
    </tr>

@foreach (var item in Model)
{
    <tr> 
        <td>@item.Number</td>
        <td>@item.Status.StatusName</td>
        <td>@item.CustomerID</td>
    </tr> 

}
</table>

HomeController: -

public ViewResult Index()
{
  return View(context.Ranges.ToList().OrderBy(m => m.RangeName));
}

public ActionResult ViewSubRange(int id)
{
  IEnumerable<TestNumber> testNumbersList = context.TestNumbers.Where(m => m.RangeID == id).ToList();

  return View("SubRange", testNumbersList);
}

Любая помощь будет очень признательна, так как я бью головой об стену с этим !!

Ответы [ 6 ]

3 голосов
/ 31 августа 2011

Возьмите два ваших представления и поместите их в частичные (если вам все еще нужны исходные представления, используйте их также, чтобы ваши представления определялись в одном месте - частичные).Для «обоих в одном представлении» добавьте новое действие и модель, в которой есть экземпляр каждой модели, необходимой для частичных чисел.

Модель:

public class MyBothInOneModel
{
    public ModelA modelA { get; set; }
    public ModelB modelB { get; set; }
}

Действие:

public ViewResult BothInOne(int idForB)
{
    MyBothInOneModel m = new MyBothInOneModel();
    m.modelA = context.Ranges.ToList().OrderBy(m => m.RangeName));
    m.modelB = context.TestNumbers.Where(m => m.RangeID == idForB).ToList();
}

View - добавить представление с вызовом для частичного рендеринга для каждого:

...
     Html.RenderPartial(Model.modelA, "PartialA");
     Html.RenderPartial(Model.modelB, "PartialB");
...

Или вы можете использовать ViewData / ViewBag, чтобы избежать создания класса MyBothInOneModel.

1 голос
/ 31 августа 2011

Вы можете использовать шаблон ViewModel для решения этой проблемы. Создайте «ViewModel», которая объединяет все различные модели и / или логику представления, необходимые для данного представления.

например:.

class TelephoneViewModel
{
    public IEnumerable<TelephoneNumberManagement.Models.TestNumber> { get; set;}
    public IEnumerable<TelephoneNumberManagement.Models.Range> { get; set; }
}

Тогда позвольте вашему новому комбинированному представлению использовать ViewModel для своей модели.

1 голос
/ 31 августа 2011

У вас есть куча вариантов. Сначала вы можете создать ViewModel со свойством

IEnumerable<TelephoneNumberManagement.Models.TestNumber> TestNumbers

и собственность

IEnumerable<TelephoneNumberManagement.Models.Range> Ranges

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

В качестве альтернативы (imho smarter solution) вы можете визуализировать каждое представление как дочернее представление @Html.Action("ActionForView1") и @Html.Action("ActionForView2").

0 голосов
/ 31 августа 2011

Также хорошим вариантом, если вы хотите получить чистое разделение, является использование Html.RenderAction из основного вида.Затем реализуйте отдельные контроллеры для каждого из описанных представлений.

0 голосов
/ 31 августа 2011

Другой вариант - использовать динамическую переменную для ваших представлений

@model IEnumerable<dynamic>

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

0 голосов
/ 31 августа 2011

Вот базовый пример того, о чем я говорю.

 public class LoginRegisterMemberViewModel
{
    public OpenIdLoginViewModel OpenIdLoginViewModel { get; set; }
    public SiteLoginViewModel SiteLoginViewModel { get; set; }
    public RegisterMemberViewModel RegisterMemberViewModel { get; set; }
    public string ReturnUrl { get; set; }
}

В моем окне входа в систему я использую @model Web.ViewModels.LoginRegisterMemberViewModel

Частичные представления также используют @modelWeb.ViewModels.LoginRegisterMemberViewModel Так что теперь у меня есть доступ к LoginRegsiterMemberViewModel.SiteLoginViewModel.property и т. Д.

Надеюсь, это не совсем не так, как вы пытаетесь достичь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...