【问题标题】:jQuery ajax call to action and return RedirectToActionjQuery ajax 调用操作并返回 RedirectToAction
【发布时间】:2015-09-24 00:10:35
【问题描述】:

这个问题和Sitefinity有关,不是简单的MVC

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

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

我的行动:

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);
}

还有我的 View 的 JS 代码:

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 调用到一个动作,然后重定向到另一个动作/控制器的正确方法是什么?

【问题讨论】:

标签: jquery ajax asp.net-mvc


【解决方案1】:

Controller.RedirectToAction

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

我认为您没有兴趣获取页面 HTML。

你应该返回一个 JsonResult:

public JsonResult SelectedVariation(string mealsAttribute, string portionsAttribute, string product)
{
    return Json(new { url = Url.Action("RegisterOrderAccountForm", new { id = "1"}) }, JsonRequestBehavior.AllowGet);
}

因为我返回一个带有属性 url 的新 json 对象,所以你的 ajax 调用应该是:

$.getJSON('@Url.Action("SelectedVariation")', { mealsAttribute: meals, portionsAttribute: portions, product: product }, function (route) {
    window.location = route.url;
});

【讨论】:

    【解决方案2】:

    参考这里:

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

    Action 应该返回如下格式的 url:

    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 调用应该像下面这样重定向:

     $.getJSON('@Url.Action("SelectedVariation")', { mealsAttribute: $('#MealsSelector').val(), portionsAttribute: $('#PortionsSelector').val(), product: '@Model.Product.Id' }, function (route) {
            window.location = route.Url;;        
        });
    

    【讨论】:

    • 不,这行不通。以前试过。也许这是 Sitefinity CMS 的问题,而不是代码本身的问题..
    【解决方案3】:

    虽然给出的大多数答案确实是正确的,但事实证明问题出在 Sitefinity 本身,而不是真正的 MVC 或 jQuery 问题。

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

    与 MVC 不同,Webforms 有页面的概念,并且内容在页面之间是分开的,因此简单地调用动作控制器是行不通的,因为它不知道动作控制器视图在哪个页面中。

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

    所以,这是正确的答案:

    这是动作:

        [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 POST,我正在做一个简单的表单提交:

    @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 的人有所帮助,并感谢大家的帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-20
      • 2011-09-21
      • 2016-07-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多