2012-12-04 6 views
5

Il mio sito mvc funziona bene con i browser mobili e non mobili; il problema che sto avendo è questo. Ho un paio di azioni che (per ragioni di registrazione) non voglio fare un return RedirectToAction(...); su così invece ho usato return View("OtherView", model); questo funzionò fino a quando ho provato su mobile, e non trova OtherView.Mobile.cshtml. C'è un modo per farlo funzionare?Determinare quale ASP.NET MVC View restituire quando non si utilizza la vista di ritorno (modello) ma restituire View ("viewName", modello)

Thise sono i punti di vista

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

Questa è l'azione

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 
} 

Normalmente vorrei solo fare return RedirectToAction(...); alla pagina di conto dettaglio, ma questo genererà una voce di registro aggiuntivo (per questo utente in lettura) e la pagina di dettaglio non ha accesso alla password. Poiché ActionResult Create aveva originariamente la password, può mostrarla all'utente per conferma, prima che non sia mai più vista.

Per essere chiari, io non voglio fare if (Request.Browser.IsMobileDevice) mobile else full perché io possa finire per l'aggiunta di un altro set di punti di vista mobile per per iPad o qualsiasi altra cosa:

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 

risposta

0

vorrei solo impostare una variabile di sessione sul loro primo utilizzo questo sarebbe un "tipo di consegna" che identifica tutte le viste supportate.

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

allora si potrebbe avere un metodo di proprietà o estensione da qualche parte

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

Si potrebbe anche mettere in un metodo diverso per la consegna della vista "add on":

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

Allora la vostra ultima chiamata potrebbe essere:

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

Quindi dovresti assicurarti che per ogni tipo di consegna hai una vista corrispondente. Potrebbe essere prudente creare una sorta di correttore per verificare di avere una vista corrispondente e se non restituire la vista standard.

0

è possibile creare una pseudo-vista che ha una variabile Partial con una variabile ViewData. @ Html.Partial troverà la vista corretta.

qualcosa di simile:

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 
} 

si può avere ora CreateSuccess.cshtml e CreateSuccess.Mobile.cshtml.

nota: hai solo bisogno di ONE CustomeView.cshtml in tutte le tue applicazioni.

Nota 2: si può sempre passare parametri in un altro modo, come viewbag, o qualsiasi tecnica ti fa sentire più confortevole: D

E 'più un po' di hack che una soluzione. Facci sapere se hai trovato qualcosa di più carino.