Du kanske kan implementera OnResultExecuting i ett filter, ungefär så här:
[FilterPopulatingMessagePropertyWithTempDataMessage]
public ActionResult Index() {
// ...
public class AuthenticationViewModel : ViewModelBase {
// ...
}
public abstract class ViewModelBase {
public string Message { get; set; }
// ...
}
public class FilterPopulatingMessagePropertyWithTempDataMessage : ActionFilterAttribute
{
public override void OnResultExecuting(ResultExecutingContext resultExecutingContext)
{
var actionResult = resultExecutingContext.Result;
if (actionResult is ViewResult)
{
var viewResult = (ViewResult)actionResult;
var viewModel = viewResult.ViewData.Model;
var tempData = viewResult.TempData;
if (viewModel is ViewModelBase)
{
var viewModelBase = (ViewModelBase)viewModel;
if (tempData[MessageKey] != null)
{
viewModelBase.Message = tempData[MessageKey].ToString();
}
}
}
}
private const string MessageKey = "Message";
}
Hej,
Jag skulle vilja förfina denna kod (om det går) och behöver lite input från er.
Jag har ganska många upprepningar av liknande kod:public ActionResult Index() { var model = new AuthenticationViewModel(); if (TempData["Message"] != null) { model.Message = TempData["Message"].ToString(); } return View(model); }Visar sedan meddelandet:
<%= Html.Message(Model.Message) %>Ser ni något sätt att få till ett action filter för detta ändamål?
Det jag skulle vilja få bort är if-satsen i kontrollen. Skulle man kunna i ett filter känna av om TempData["Message"] inte är en tom sträng och då fylla modellens Message property automatiskt.
Krukset jag ser är att jag skapar upp olika ViewModels i olika kontrollers och gör man ett filter som körs OnActionExecuting så vet inte filtret vilen viewmodel som används. Å andra sidan har alla custom viewmodels en gemensam basklass där propertyn ligger.På något sätt vilja alltså ha det så här:
[MessageFilter(möjligtvis att man anger vilken viewmodel som används här: typeof(AuthenticationViewModel))] public ActionResult Index() { var model = new AuthenticationViewModel(); return View(model); //här är model.Message fylld med text om ViewData["Message"] innehåller en sträng. }Detta är kanske omöjligt att uppnå? Skulle det finnas ett annat sätt?
Det ända jag vill är att slippa hämta upp TempData["Message"] i alla kontroller!