确定在不使用返回视图(模型)时返回哪个ASP.NET MVC视图但返回View(“viewName”,model)

时间:2012-12-04 21:03:25

标签: c# asp.net asp.net-mvc mobile views

我的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

2 个答案:

答案 0 :(得分:0)

我只会在第一次使用时设置一个会话变量,它将是一个标识所有支持视图的“传递类型”。

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

然后你可以在某处使用属性或扩展方法

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

你甚至可以使用不同的方法来传递View“add on”:

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

然后你的终极电话可能是:

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

然后你必须确保每种交付类型都有相应的视图。构建某种检查器以验证您是否具有匹配的视图并且如果不返回标准视图可能是谨慎的。

答案 1 :(得分: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

这比解决方案更有点黑客攻击。如果你想出更漂亮的东西,请告诉我们。