Еще один способ сделать эту работу - не ограничивать тип вашей модели с помощью директивы @model
. Затем вы можете использовать свои собственные переменные для различных типов моделей, которые могут быть переданы в частичное представление (либо из явного указания в вызове @Html.Partial
, либо просто унаследованного из содержащего представления).
Допустим, пользователи вашего сайта - это либо сотрудники, либо клиенты, и у вас есть небольшое частичное представление для отображения некоторой информации, которая должна работать независимо от того, как они вошли (или даже если нет). Ваши модели выглядят примерно так:
public class Employee
{
public virtual int ID { get; set; }
public virtual string FirstName { get; set; }
public virtual string LastName { get; set; }
public virtual ICollection<Role> Roles { get; set; }
public string GetPrimaryRole() { /* Fetch the name of the primary Role from Roles */ }
// A bunch of other stuff...
}
public class Customer
{
public virtual int ID { get; set; }
public virtual string FullName { get; set; }
public virtual int RewardsPoints { get; set; }
// A bunch of other stuff...
}
Как видите, информация похожа, но было бы очень трудно абстрагировать эти две вещи в общий интерфейс. В верхней части вашего частичного представления вы можете поместить что-то вроде этого:
@{
var employee = Model as Employee;
var customer = Model as Customer;
string message = "Welcome, Guest!"; //This is displayed if they aren't logged in
if (employee != null)
{
message = string.Format("Welcome, {0} {1}, {2}!",
employee.FirstName, employee.LastName, employee.GetPrimaryRole());
}
else if (customer != null)
{
message = string.Format("Welcome, {0}! You have {1} points!",
customer.FullName, customer.RewardsPoints);
}
}
<div>@message</div>
Очевидно, что это очень упрощенный пример, но он показывает, как это можно сделать просто и аккуратно. ; -)