首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >jQuery ajax操作调用并返回RedirectToAction

jQuery ajax操作调用并返回RedirectToAction
EN

Stack Overflow用户
提问于 2015-09-16 12:06:08
回答 3查看 2.7K关注 0票数 1

这个问题与Sitefinity有关,而不是简单的MVC。

我试图通过jQuery发布一个帖子,到服务器上,获取一个Id,然后检索Id,让页面重定向到另一个控制器中的另一个操作。

这总是返回404,所以我需要你的帮助。

我的行动:

代码语言:javascript
运行
复制
public ActionResult SelectedVariation(string mealsAttribute, string portionsAttribute, string product)
{
    Guid productId = new Guid(product);

    CatalogManager catalogManager = CatalogManager.GetManager();
    EcommerceManager ecommerceManager = EcommerceManager.GetManager();

    ProductListWidgetModel model = new ProductListWidgetModel();
    model.Product = catalogManager.GetProduct(productId);
    model.ProductVariations = catalogManager.GetProductVariations(productId).ToList();

    model.SelectedVariation = model.ProductVariations.Where(x => x.Variant.ToLower().Contains(mealsAttribute.ToLower()) && x.Variant.ToLower().Contains(portionsAttribute.ToLower())).FirstOrDefault().Id.ToString();

     return RedirectToAction("Index", "RegisterOrderAccountForm", new { Id = model.SelectedVariation.ToString()});

    //I've tried these ones aswell
    //return Json(new { result = "Redirect", url = Url.Action("Index", "RegisterOrderAccountForm", new { Id = model.SelectedVariation.ToString()})}, JsonRequestBehavior.AllowGet);

    // new RouteValueDictionary(new { controller = "RegisterOrderAccountForm", action = "Index", Id = model.SelectedVariation.ToString() })), JsonRequestBehavior.AllowGet);
}

我的观点的JS代码:

代码语言:javascript
运行
复制
function GetSelectedVariation() {
    var meals = $('#MealsSelector').val();
    var portions = $('#PortionsSelector').val();

    $.getJSON('@Url.Action("SelectedVariation")', { mealsAttribute: $('#MealsSelector').val(), portionsAttribute: $('#PortionsSelector').val(), product: '@Model.Product.Id' }, function (route) {
        window.location = route;
        //Tried this aswell but to no avail
        //window.location.href = getRootUrl() + route.RouteValues[1].Value + '/' + route.RouteValues[0].Value + '/' + route.RouteValues[2].Value;
    });
}

我做错了什么总是得到404?我注意到的另一件事是,在响应中,Id值没有随当前表单一起出现。

让ajax调用操作,然后重定向到另一个操作/控制器,正确的方法是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-09-23 16:02:19

虽然所给出的大多数答案都是正确的,但事实证明,问题是与Sitefinity有关,而不是真正的MVC或jQuery问题。

虽然Telerik市场的Sitefinity是一个企业级的MVC CMS,但实际上Sitefinity的核心是用WebForms构建的。

与MVC不同,Webforms有页面的概念,内容在页面之间分离,因此简单地调用动作控制器将无法工作,因为它不知道在哪个页面中操作控制器视图。

为了实现这一点,我最终将ID存储在一个会话变量中,并且在从页面目录中获取预期的页面之后,我只是使用了一个简单的重定向。

所以,以下是正确的答案:

这就是行动:

代码语言:javascript
运行
复制
    [HttpPost]
    public ActionResult PlaceOrder()
    {
        string mealsAttribute = Request.Form["MealsSelector"].ToString();
        string portionsAttribute = Request.Form["PortionsSelector"].ToString();
        Guid productId = new Guid(Request.Form["ProductId"].ToString());


        CatalogManager catalogManager = CatalogManager.GetManager();
        EcommerceManager ecommerceManager = EcommerceManager.GetManager();

        ProductListWidgetModel model = new ProductListWidgetModel();
        model.Product = catalogManager.GetProduct(productId);
        model.ProductVariations = catalogManager.GetProductVariations(productId).ToList();

        model.SelectedVariation = model.ProductVariations.Where(x => x.Variant.ToLower().Contains(mealsAttribute.ToLower()) && x.Variant.ToLower().Contains(portionsAttribute.ToLower())).FirstOrDefault().Id.ToString();

        var pages = GetLivePagesNativeAPI();
        var page = pages.Where(x => x.NavigationNode.Title == "Subscribe");

        string action = Url.Action("Index", "RegisterOrderAccountForm", new { Id = model.SelectedVariation.ToString() });
        string destiny = FullyQualifiedApplicationPath + page.FirstOrDefault().UrlName.ToString();

        Session["ProductListWidget_SelectedVariation"] = model.SelectedVariation;

        return Redirect(destiny);
    }

在我的视图中,我删除了jQuery的Ajax帖子,并做了一个简单的表单提交:

代码语言:javascript
运行
复制
@using (Html.BeginFormSitefinity("PlaceOrder", "VariationSelector", FormMethod.Post))
{
    <div class="bestillbox">
        <input type="hidden" name="ProductId" value="@Model.Product.Id.ToString()" />
        <table>
            <tr>
                <th id="row">@Html.DropDownList("MealsSelector", @Model.Meals, new { @onchange = "GetPortions();", Name="MealsSelector" })</th>
                <td id="row">Middager</td>
            </tr>
            <tr>
                <th id="row">@Html.DropDownList("PortionsSelector", @Model.Portions, new { @onchange = "GetPrice();", Name="PortionsSelector" })</th>
                <td id="row">Porsjoner</td>
            </tr>
        </table>
        <h6><span id="totalPrice"></span><span>kr/Uka</span></h6>
        <input type="submit" class="bestillbutton" value="BESTILL"/>
    </div>
}

希望这能帮助任何与Sitefinity有关的人,并感谢你们的帮助。

票数 0
EN

Stack Overflow用户

发布于 2015-09-16 12:43:58

Controller.RedirectToAction

返回对浏览器的HTTP 302响应,这将导致浏览器向指定的操作发出GET请求。

我不认为你有兴趣获取HTML页面。

您应该返回一个JsonResult:

代码语言:javascript
运行
复制
public JsonResult SelectedVariation(string mealsAttribute, string portionsAttribute, string product)
{
    return Json(new { url = Url.Action("RegisterOrderAccountForm", new { id = "1"}) }, JsonRequestBehavior.AllowGet);
}

由于我使用属性url返回一个新的json对象,所以ajax调用应该是:

代码语言:javascript
运行
复制
$.getJSON('@Url.Action("SelectedVariation")', { mealsAttribute: meals, portionsAttribute: portions, product: product }, function (route) {
    window.location = route.url;
});
票数 0
EN

Stack Overflow用户

发布于 2015-09-16 13:00:01

请参阅此处:

https://stackoverflow.com/a/12006362/2632619

操作应返回url,格式如下:

代码语言:javascript
运行
复制
public ActionResult SelectedVariation(string mealsAttribute, string portionsAttribute, string product)
{
    Guid productId = new Guid(product);

    CatalogManager catalogManager = CatalogManager.GetManager();
    EcommerceManager ecommerceManager = EcommerceManager.GetManager();

    ProductListWidgetModel model = new ProductListWidgetModel();
    model.Product = catalogManager.GetProduct(productId);
    model.ProductVariations = catalogManager.GetProductVariations(productId).ToList();

    model.SelectedVariation = model.ProductVariations.Where(x => x.Variant.ToLower().Contains(mealsAttribute.ToLower()) && x.Variant.ToLower().Contains(portionsAttribute.ToLower())).FirstOrDefault().Id.ToString();
    // return RedirectToAction("Index", "RegisterOrderAccountForm", new { Id = model.SelectedVariation.ToString()});

    var redirectUrl = new UrlHelper(Request.RequestContext).Action("Index", "RegisterOrderAccountForm", new { Id = model.SelectedVariation.ToString()});
    return Json(new { Url = redirectUrl });

}

那么ajax调用应该重定向如下所示:

代码语言:javascript
运行
复制
 $.getJSON('@Url.Action("SelectedVariation")', { mealsAttribute: $('#MealsSelector').val(), portionsAttribute: $('#PortionsSelector').val(), product: '@Model.Product.Id' }, function (route) {
        window.location = route.Url;;        
    });
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32608137

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档