2012-12-04 14 views
5

Mam moją witrynę mvc działa dobrze z przeglądarek mobilnych i innych; problem, który mam, jest taki. Mam kilka akcji, które (z powodów logowania) nie chcę zrobić return RedirectToAction(...); na tym, zamiast tego użyłem return View("OtherView", model); działało to dopóki nie wypróbowałem go na urządzeniu mobilnym i nie znalazłem OtherView.Mobile.cshtml. Czy istnieje sposób, aby to zadziałało?Określić, który widok ASP.NET MVC powrócić, gdy nie jest używany powrót Widok (model), ale powrót Widok ("viewName", model)

Thise są poglądami

Views/Account/Create.cshtml 
Views/Account/Create.Mobile.cshtml 
Views/Account/CreateSuccess.cshtml 
Views/Account/CreateSuccess.Mobile.cshtml 

To Action

public ActionResult Create(FormCollection form) 
{ 
    TryUpdateModel(model); 

    if(!ModelState.IsValid) { return View(); } // this works correctly 

    var model = new Account(); 

    var results = database.CreateAccount(model); 

    if(results) return View("CreateSuccess", model); // trying to make this dynamic 

    return View(model); // this works correctly 
} 

Normalnie bym po prostu zrobić return RedirectToAction(...); na stronie konto szczegół, ale to będzie generować dodatkowy wpis dziennika (dla tego użytkownika czytanie), a strona szczegółów nie ma dostępu do hasła. Ponieważ ActionResult Create miał pierwotnie hasło, może je pokazać użytkownikowi w celu potwierdzenia, zanim jeszcze nigdy go nie zobaczymy.

Żeby było jasne, nie chcę robić if (Request.Browser.IsMobileDevice) mobile else full bo mogę skończyć dodając inny zestaw mobilnych widokiem na specjalnie dla iPada lub cokolwiek innego:

Views/Account/Create.cshtml 
Views/Account/Create.Mobile.cshtml 
Views/Account/Create.iPad.cshtml 
Views/Account/CreateSuccess.cshtml 
Views/Account/CreateSuccess.Mobile.cshtml 
Views/Account/CreateSuccess.iPad.cshtml 

Odpowiedz

0

chciałbym po prostu ustawić zmienną sesji po ich pierwszym użyciu byłby to "rodzaj dostawy" określający wszystkie obsługiwane widoki.

public enum DeliveryType 
{ 
    Normal, 
    Mobile, 
    Ipad, 
    MSTablet, 
    AndroidTablet, 
    Whatever 
} 

Wtedy można mieć właściwości lub rozszerzenie metody gdzieś

public DeliveryType UserDeliveryType 
{ 
    get 
    { 
     return (DeliveryType)Session["DeliveryType"]; 
    } 
    set 
    { 
     Session["UserDeliveryType"] = value; 
    } 
} 

Można nawet umieścić w innej metody dostawy View "add on":

public string ViewAddOn(string viewName) 
{ 
    return (UserDeliveryType != DeliveryType.Normal) ? 
     string.Format("{0}.{1}", viewName, UserDeliveryType.ToString()) : 
     viewName; 
} 

wówczas Ostateczne połączenie może być:

if (results) return View(ViewAddOn("CreateSuccess"), model); 

Następnie musisz się upewnić, że dla każdego rodzaju dostawy masz odpowiedni widok. Rozsądnie jest zbudować coś w rodzaju kontrolera, aby zweryfikować, czy masz pasujący widok, a jeśli nie zwrócisz widoku standardowego.

0

można utworzyć pseudo-widok ze zmienną Partial with ViewData. @ Html.Partial znajdzie odpowiedni widok.

coś takiego:

CustomView.cshtml: 
if (ViewData.ContainsKey("PartialViewName")) { 
@Html.Partial(ViewData[PartialViewName]); 
} 

Controller.cs: 
public ActionResult Create(FormCollection form) 
{ 
    TryUpdateModel(model); 
    ViewData[PartialViewName] = "CreateSuccess"; 
    if(!ModelState.IsValid) { return View(); } // this works correctly 

    var model = new Account(); 

    var results = database.CreateAccount(model); 

    if(results) return View("CustomView", model); // trying to make this dynamic 

    return View(model); // this works correctly 
} 

można mieć teraz CreateSuccess.cshtml i CreateSuccess.Mobile.cshtml.

uwaga: w swojej aplikacji potrzebujesz tylko ONE CustomeView.cshtml.

Uwaga2: zawsze można przekazać parametry w inny sposób, jak viewbag, czy cokolwiek technika sprawia, że ​​czujesz się bardziej komfortowe: D

To nieco więcej niż Hack rozwiązania. Daj nam znać, jeśli wymyśliłeś coś ładniejszego.

Powiązane problemy