博学的钢笔 · JS得到div ...· 2 周前 · |
豪气的鸡蛋面 · java代码转javascript ...· 4 月前 · |
踏实的脆皮肠 · 引入Elasticsearch的系统架构实战 ...· 1 年前 · |
酷酷的毛巾 · C# 日志工具汇总(转) - ...· 1 年前 · |
逃跑的键盘 · opencsv 读取指定行-掘金· 1 年前 · |
热情的登山鞋 · Invalid header ...· 1 年前 · |
这个问题与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);
}
我的观点的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调用操作,然后重定向到另一个操作/控制器,正确的方法是什么?
发布于 2015-09-23 16:02:19
虽然所给出的大多数答案都是正确的,但事实证明,问题是与Sitefinity有关,而不是真正的MVC或jQuery问题。
虽然Telerik市场的Sitefinity是一个企业级的MVC CMS,但实际上Sitefinity的核心是用WebForms构建的。
与MVC不同,Webforms有页面的概念,内容在页面之间分离,因此简单地调用动作控制器将无法工作,因为它不知道在哪个页面中操作控制器视图。
为了实现这一点,我最终将ID存储在一个会话变量中,并且在从页面目录中获取预期的页面之后,我只是使用了一个简单的重定向。
所以,以下是正确的答案:
这就是行动:
[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帖子,并做了一个简单的表单提交:
@using (Html.BeginFormSitefinity("PlaceOrder", "VariationSelector", FormMethod.Post))
<div class="bestillbox">
<input type="hidden" name="ProductId" value="@Model.Product.Id.ToString()" />
<table>
<th id="row">@Html.DropDownList("MealsSelector", @Model.Meals, new { @onchange = "GetPortions();", Name="MealsSelector" })</th>
<td id="row">Middager</td>
<th id="row">@Html.DropDownList("PortionsSelector", @Model.Portions, new { @onchange = "GetPrice();", Name="PortionsSelector" })</th>
<td id="row">Porsjoner</td>
</table>
<h6><span id="totalPrice"></span><span>kr/Uka</span></h6>
<input type="submit" class="bestillbutton" value="BESTILL"/>
}
希望这能帮助任何与Sitefinity有关的人,并感谢你们的帮助。
发布于 2015-09-16 12:43:58
返回对浏览器的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;
});
发布于 2015-09-16 13:00:01
请参阅此处:
https://stackoverflow.com/a/12006362/2632619
操作应返回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()});
逃跑的键盘 · opencsv 读取指定行-掘金 1 年前 |