Строгая типизация метода ASP.NET Controller.View () для типа модели - PullRequest
2 голосов
/ 23 января 2009

Нет строго типизированного метода View () для возврата ActionResult. Итак, предположим, у меня есть

class Edit : ViewPage<Frob>

В моем FrobController я буду делать что-то вроде «return View (« Edit », someFrob);». Здесь нет проверки, поэтому я всегда должен вручную синхронизировать представление и использование его контроллером. Это неоптимально, и я не знаю никаких встроенных исправлений.

Я добавил этот метод в базовый класс моего контроллера:

public ActionResult ViewPage<V, M>(V view, M model)
    where V : ViewPage<M>
    where M : class {
    return View(typeof(V).Name, model);
}

Примечание: причина, по которой я смотрю объект, который никогда не используется, потому что, AFAIK, нет способа получить тип C # умозаключение работать иначе. Если я убрал параметр просмотра, мне нужно указать V явно, что также значит тоже указывать M явно ... Вздох.

Итак, теперь я могу сделать это:

  return ViewPage(new Views.Frob.Edit(), myFrob);

Я указываю точное представление (без проблем, если оно переименовывается), и myFrob проверяется на тип, чтобы быть подходящим типом модели. Уродливая сторона в том, что я новичок в редактировании. В качестве альтернативы я мог бы написать:

  return ViewPage((Views.Frob.Edit)null, myFrob);

Один минус в том, что модель должна точно соответствовать. Так что с ViewPage> я не могу передать в список. Я думал, что это может сработать:

    public ActionResult ViewPage<V, M, T>(V view, T model)
        where V : ViewPage<M>
        where M : class 
        where T : M {
        return View(typeof(V).Name, model);
    }

Но вывод типа C # не может этого понять. Другая потенциальная проблема заключается в том, что имя типа представления может быть неправильным, так как я думаю, что оно может быть переопределено атрибутами. Но это легко исправить, если я столкнусь с этим.

Вопросы:

  1. Как мне сделать этот синтаксис чище?
  2. Какие минусы мне здесь не хватает?

Редактировать: Что касается Контроллера, знающего о Представлении, это только немного делает. Единственное, что он получает из представления, это Type, для которого он берет имя. Так что это эквивалентно передаче имени строки. И строго типизированная модель, которая должна совпадать, иначе она потерпит неудачу. Так что он на самом деле не знает слишком много о View - это просто хитрость, чтобы заставить компилятор ловить ошибки.

Ответы [ 3 ]

4 голосов
/ 23 января 2009

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

3 голосов
/ 23 января 2009

Взгляните на этот пример: http://oddiandeveloper.blogspot.com/2008/11/strongly-typed-view-names.html

Вы можете позвонить вам Посмотреть так:

return View(typeof(Views.en.Home.about), AboutModel);
0 голосов
/ 24 января 2009

Я все еще ломаю голову над тем, что вы получаете, делая это, не говоря, что вы не правы. Ayende делает то же самое почти ежедневно :-) В любом случае, самый чистый синтаксис, который я могу придумать, таков:

public ActionResult Test() {
    return View<Views.Module1.Test, string>("Hello All");
}


protected ActionResult View<TView, TModel>(TModel model)
    where TView : ViewPage<TModel>
    where TModel : class {
        return View(typeof(TView).Name, model);
}

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

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