Un paio di punti. Puoi digitare il tuo valore di ritorno come ViewResult se sai che è tutto ciò che intendi restituire. Quindi puoi interrogare quel valore dall'implementazione sostituita. Ancora più importante, secondo il sorgente MVC v1, chiamare View (oggetto) semplicemente imposta ViewData.Model sul controller, quindi costruisce un ViewResult.
Controller.cs: 440
protected internal ViewResult View(object model) {
return View(null /* viewName */, null /* masterName */, model);
}
Controller.cs: 456
protected internal virtual ViewResult View(string viewName, string masterName, object model) {
if (model != null) {
ViewData.Model = model;
}
return new ViewResult {
ViewName = viewName,
MasterName = masterName,
ViewData = ViewData,
TempData = TempData
};
}
Quindi, tutto quello che dovete fare è chiamare il metodo di base e chiamare View (stringa).
namespace BaseControllers
{
public class CoolController
{
public virtual ViewResult Get()
{
var awesomeModel = new object();
return View(awesomeModel);
}
}
}
public class CoolController : BaseControllers.CoolController
{
public override ViewResult Get()
{
var ignoredResult = base.Get();
// ViewData.Model now refers to awesomeModel
return View("NotGet");
}
}
Ovviamente si sprecano cicli di CPU che costruiscono ViewResult che si ignora.Così, invece si può fare questo:
public class CoolController : BaseControllers.CoolController
{
public override ViewResult Get()
{
var baseResult = base.Get();
baseResult.ViewName = "NotGet";
return baseResult;
}
}
Se il controller di base ritorna ActionResult, dovrete gettarlo ai ViewResult prima di cambiare la ViewName.
fonte
2009-10-15 02:24:35
Hai provato solo ad ereditare dal controller di base e preparare le viste? – LukLed