5

我的 mvc 网站在移动和非移动浏览器上运行良好;我遇到的问题是这个。我有几个操作(出于日志记录的原因)我不想做return RedirectToAction(...);,所以我一直在使用return View("OtherView", model);它,直到我在移动设备上尝试它,它没有找到 OtherView.Mobile.cshtml。有没有办法使这项工作?

这是意见

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
4

2 回答 2

0

我只会在他们第一次使用时设置一个会话变量,该变量将是识别所有支持的视图的“交付类型”。

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

然后你可以在某处拥有一个属性或扩展方法

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

您甚至可以采用不同的方法来交付“附加”视图:

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

那么你的最终电话可能是:

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

然后,您只需确保对于每种交付类型都有相应的视图。谨慎的做法是构建某种检查器来验证您是否有匹配的视图,如果没有则返回标准视图。

于 2012-12-04T21:21:06.293 回答
0

您可以创建一个伪视图,该视图具有带有 ViewData 变量的 Partial。@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

与其说是解决方案,不如说是一种技巧。如果你想出了更漂亮的东西,请告诉我们。

于 2013-04-01T17:24:22.527 回答