MVC - интерфейс как параметр действия контроллера - PullRequest
2 голосов
/ 14 апреля 2011

Я хочу передать один из нескольких классов, которые реализуют интерфейс из моего представления обратно в действие моего контроллера.Я использую ActionLink в своем представлении, передавая экземпляр своему действию, но он, естественно, завершается неудачей, потому что MVC не может работать с интерфейсами через привязку модели по умолчанию.

Итак:

<%=Html.ActionLink(flow.Source.Name, "Get", new {container=flow.Source})%>

находится в цикле, и каждый поток. Источник соответствует IContainer.

public class Flow 
{
    public virtual IContainer Source { get; private set; }
}

public interface IContainer
{
//members here
}

public class File : IContainer
{}

public class Worksheet : IContainer
{}

В основном я хочу вызвать метод действия:

public ActionResult Get(IContainer container)
{
   // Do something
}

Причина в том, что мне нужно получить состояние текущего контейнера, переданного моему методу действия, из базы данных.Я использую NHibernate, и у меня есть сущности, сопоставленные с таблицей для каждой сущности, поэтому у меня есть одна для Файла и одна для Рабочего листа, например, поэтому мне нужно решить, какой класс доступа к данным использовать.Есть смысл?Вероятно, нет!

Можно ли это сделать, не двигаясь к контейнеру базового класса?Могу ли я придерживаться интерфейса, переданного моему методу действия, и разрешить экземпляр подтипа, переданный вместо интерфейса?

Любая помощь с этим будет с благодарностью.

1 Ответ

1 голос
/ 16 апреля 2011

Интерфейсу требуется «некоторая» конкретная реализация для ссылки, когда вы вызываете свой класс.Я думаю, что, судя по вашему сообщению, вы знаете об этом:) С учетом сказанного, здесь есть «своего рода» подход, в котором вы просто создаете свой собственный механизм связывания моделей, который должен знать (или как) отображать и создавать конкретныйтип (напрямую или путем внедрения зависимости)

ASP.NET MVC - привязка пользовательской модели для интерфейса типа

...