webForumDet fria alternativet

Tillvägagångssätt för att visa meddelanden till användaren i MVC projekt

.NET

1 svar · 1 209 visningar · startad av doggelito

Medlem sedan juni 20003 076 inlägg
Frågan#1

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!

Medlem sedan feb. 200563 inlägg
#2

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";
    }

doggelito skrev:

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!

257 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
119 ms — deklarationer (db)
0 ms — hämta statistik (cache)
128 ms — hämta tråd, inlägg och bilagor (db)
125 ms — ändringar (db)