Как отобразить правильный вид в зависимости от «типа» модели? - PullRequest
2 голосов
/ 21 января 2011

У меня есть база данных, настроенная с использованием таблицы EF для каждого типа, и я пытаюсь написать подробное представление в Razor для страницы сведений. Сложность в том, что у меня есть базовый класс Product и два производных класса VideoProduct и DatabaseProduct, и я хочу отобразить их все в виде списка и иметь возможность предоставить подробный вид для каждого типа. У меня возникли проблемы с выяснением того, как определить, какой View возвращать в зависимости от типа объекта, который возвращается из базы данных. Вот часть кода:

МОДЕЛИ:

public abstract class Product
{
    // some properties
}

public class DatabaseProduct
{
    int SpecialInvoiceID { get; set; }
}

public class VideoProduct
{
    public virtual ICollection<FilmsCollection> FilmsCollectionIDs { get; set; }
    public virtual ICollection<OtherCollection> OtherCollectionIDs { get; set; }
}

CONTROLLER:

public ActionResult Details(int id)
{
    var product = db.Products.Find(id); // could be a VideoProduct or a DatabaseProduct

    if (product == null)
        return RedirectToAction("Index");

    return View("Details", product);
}

ВИД:

Что мне делать здесь, чтобы в подробном представлении отображался любой тип модели? Или что я могу сделать в контроллере для вызова разных представлений для отображения для разных классов моделей? Или я могу использовать DisplayForModel?

Я пытался найти пример этого через Google, но я не смог получить какую-либо полезную информацию. Любое руководство будет с благодарностью. Спасибо!

Ответы [ 3 ]

2 голосов
/ 21 января 2011

Вам потребуется использовать метод расширения Queryable.OfType (TResult) , чтобы отфильтровать объекты типа DatabaseProduct или VideoProduct.Посмотрите на этот пример кода

DatabaseProduct dbp = (from d in db.Products.OfType<DatabaseProduct>()
                       where d.Id == id
                       select d.FirstOrDefault();

Этот тип запроса отфильтрует объекты определенного типа, и вы сможете действовать соответствующим образом при создании списка продуктов (например, перенаправить пользователя на два разных действия деталиили что-то в этом роде)

Посмотрите здесь для получения дополнительной информации.

2 голосов
/ 21 января 2011

Посмотрите на описание шаблонов / шаблонов, описанное здесь: http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-4-custom-object-templates.html

1 голос
/ 21 января 2011

Вы можете попробовать это так:

public ActionResult Details(int id)
{
    var product = db.Products.Find(id); // could be a VideoProduct or a DatabaseProduct

    if (product == null)
        return RedirectToAction("Index");

    return View(product.GetType().Name, product);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...