2012-12-04 2 views
5

У меня есть сайт mvc, хорошо работающий с мобильными и немобильными браузерами; проблема, с которой я столкнулась, - это. У меня есть пара действий, которые (по причинам ведения журнала) я не хочу делать return RedirectToAction(...);, так что вместо этого я использовал return View("OtherView", model);, это сработало, пока я не попробовал его на мобильном устройстве, и он не находит OtherView.Mobile.cshtml. Есть ли способ сделать эту работу?Определить, какой ASP.NET MVC View вернуть, когда не используется return View (model), но return View («viewName», model)

Thise являются мнением

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

Это действие

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 
} 

Обычно я бы просто сделать return RedirectToAction(...); на страницу счета подробно, но это создаст дополнительную запись в журнале (для этого пользователя чтение), а также страница сведений не имеет доступа к паролю. Так как у ActionResult Create был пароль, он может показать его пользователю для подтверждения, прежде чем его больше не увидеть.

Чтобы было ясно, я не хочу делать if (Request.Browser.IsMobileDevice) mobile else full, потому что в конечном итоге можно добавить еще один набор мобильных представлений для для IPad или любой другой:

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 

ответ

0

Я бы просто установить переменную сеанса на их первом использовании это будет «тип доставки», определяющий все поддерживаемые виды.

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

Тогда вы могли бы иметь свойство или метод расширения где

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

Вы можете даже положить в другой метод к поставке View «добавить на»:

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

Тогда ваш окончательный звонок может быть:

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

Тогда вам просто нужно убедиться, что для каждого типа доставки у вас есть соответствующее представление. Может быть разумным создать какую-то проверку, чтобы убедиться, что у вас есть соответствующее представление, и если не вернуть стандартное представление.

0

вы можете создать псевдо-представление с частичной переменной ViewData. @ Html.Partial найдет правильный вид.

что-то вроде этого:

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 
} 

вы можете теперь CreateSuccess.cshtml и CreateSuccess.Mobile.cshtml.

примечание: вам нужно только ОДИН CustomeView.cshtml в вашем приложении.

Примечание2: вы всегда можете передать параметры в другой манере, как viewbag, или любой другой метод заставляет вас чувствовать себя более комфортабельный: D

Это больше немного рубить, чем решение. Сообщите нам, если вы придумали что-нибудь красивое.