2011-02-02 3 views
1

В конце моей точки зрения, я называю это:Переопределение действие вызывается из ChildActionExtensions

<%= Html.Action("ProductLayoutAndLimits", this.Model) /* Render product-specific options*/ %> 

Это действие является виртуальным в моем контроллере:

[ChildActionOnly] 
    public virtual ActionResult ProductLayoutAndLimits(DeliveryOptionsViewModel optionsViewModel) 
    { 
     return new EmptyResult(); 
    } 

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

public override System.Web.Mvc.ActionResult ProductLayoutAndLimits(DeliveryOptionsViewModel optionsViewModel) 
    { 

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

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

Редактировать

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

Были предложены шаблоны, но учтите, что мне нужен код контроллера, который должен быть выполнен до того, как будет визуализирован новый дополнительный код представления. Базовый контроллер находится в решении, которое служит платформой для других продуктов. Они не могут делать ничего конкретного продукта. После того, как они представят свое мнение, намерение заключается в том, что мое переопределение дочернего действия будет вызвано. Мой код контроллера проверяет количество вещей, чтобы определить, как устанавливать свойства на моей модели, прежде чем отображать представление.

Редактировать

Я нашел проблему. Я чувствую себя глупо, как обычно. Html.Action вызывается из кода представления платформы. Оказалось, что с июля мы используем определенный продукт для этого продукта. Я не заметил, потому что мы обычно не используем конкретные представления продукта. Упс!

+1

Вы установили точку останова в методе ProductLayoutAndLimits базового контроллера и была ли эта точка останова удалена? Если это так, вы, вероятно, говорите Html.Action, чтобы использовать неправильный контроллер. Если запрос берется из Base :: SomeAction, то вызов Html.Action («SomeOtherAction») будет искать Base :: SomeOtherAction. Вам нужно передать «Derived» в качестве параметра в Html.Action, чтобы заставить его искать Derived :: SomeOtherAction. – Levi

+0

См. Мое редактирование. Звонок даже не был сделан. Мальчик, я чувствую себя глупо :) – Samo

+0

@Levi: Хотя моя проблема была на самом деле тем, что я забыл, ваш ответ действительно правильный. Единственный способ повлиять на действие моего продукта будет, если контроллер моего продукта - тот, который отображает представление. Не могли бы вы опубликовать это как ответ, чтобы я мог его принять? Благодаря! – Samo

ответ

0

Почему вы используете дочерние действия и управляющие контроллеры, чтобы справиться с этим? Почему не отображаются шаблоны:

<%= Html.DisplayForModel("ProductLayoutAndLimits") %> 

ProductLayoutAndLimits где бы имя соответствующего шаблона дисплея.

Пример:

Модель:

public class BaseViewModel 
{ 
    public string BaseProp { get; set; } 
} 

public class DerviedViewModel : BaseViewModel 
{ 
    public string DerivedProp { get; set; } 
} 

Контроллер:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(new DerviedViewModel 
     { 
      BaseProp = "base prop", 
      DerivedProp = "derived prop" 
     }); 
    } 
} 

View (~/Views/Home/Index.cshtml):

@model AppName.Models.BaseViewModel 
@Html.DisplayForModel() 

Показать Шаблон (~/Views/Home/DisplayTemplates/DerviedViewModel.cshtml):

@model AppName.Models.DerviedViewModel 
@Html.DisplayFor(x => x.BaseProp) 
@Html.DisplayFor(x => x.DerivedProp) 

Конечно, вы могли бы также иметь шаблон отображения для базового класса (~/Views/Home/DisplayTemplates/BaseViewModel.cshtml):

@model AppName.Models.BaseViewModel 
@Html.DisplayFor(x => x.BaseProp) 

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

+0

Причина в том, что я не могу сделать ничего конкретного продукта в базовом контроллере. Другими словами, я не могу установить DerivedProp. Класс базового контроллера относится к коду, который служит платформой для других продуктов. Для моего продукта определенный контроллер устанавливает значения для свойств производных классов. – Samo

+0

@ Само, хорошо, все же шаблоны дисплеев будут отлично работать в вашем случае. –

+0

Как так? Мне нужен код контроллера, чтобы установить свойства. Выполнение этого материала в представлении нарушит MVC. Я не понимаю, как шаблон будет работать для меня. – Samo

Смежные вопросы