有没有办法根据从MVC操作返回的视图来设置部分视图加载到哪个div?例如,MVC控制器动作可以根据某些逻辑返回两个视图中的一个(视图A或视图B)。如果返回'View A',则在Ajax调用的done函数中将其加载到'div A'中,但如果返回'View B',则将其加载到'div B'。
public ActionResult SomeActionMethod()
{
if (someCondition == true) {
return PartialView("ViewA", new SomeModel());
}
else {
return PartialView("ViewB", new AnotherModel());
}
}
.done(function(data) {
if (isViewA === true) { // How do I determine which view it is?
$('#div-a').html(data);
} else {
$('#div-b').html(data);
}
})
是否有已知/可接受的方法(如何确定它是View A还是View B)?我想过两种方法可以做到这一点,但两者看起来都有些笨拙。如果没有普遍接受/批准的方式,那么以下想法是好的......
创意1:
在返回的html中搜索仅在该视图中找到的唯一元素或隐藏输入值。这并不像第一次听起来那么容易,因为返回的数据不仅仅是简单的html,而是某种嵌套的字符串/对象(不太确定)。对于顶级元素,需要使用jQuery'filter'方法:
$(data).filter('#unique-element');
否则应使用'find'方法。
创意2:
在控制器操作中,对于返回的其中一个视图(视图A),将Response.StatusCode设置为200的范围内尚未使用的自定义值(不是200-208,226)。然后在ajax done函数中指定所有3个参数,并检查第三个参数status属性,以与您在控制器操作中设置的响应状态进行比较。
if (someCondition == true) {
Response.StatusCode = 299;
return PartialView("ViewA", new SomeModel());
}
else {
return PartialView("ViewB", new AnotherModel());
}
.done(function(data, textStatus, jqXHR) {
if (jqXHR.status === 299) {
// It’s View A so load it into div A
}
else {
// It’s View B so load it into div B
}
})
这就像一个魅力,但似乎比想法1更黑。
答案 0 :(得分:0)
我建议分别加载每个div的内容。例如:
的Javascript
$('div-a').html(contentforA);
$('div-b').html(contentforB);
控制器
public ActionResult ContentA()
{
if (someCondition)
{
return PartialView("ViewA", new SomeModel());
}
return new EmptyResult();
}
public ActionResult ContentB()
{
if (!someCondition)
{
return PartialView("ViewB", new AnotherModel());
}
return new EmptyResult();
}
答案 1 :(得分:0)
您可以返回PartialView和一个参数来确定您想要呈现为Json对象的视图:
public ActionResult LoadView()
{
if (someCondition == true)
{
return Json(new { Url = Url.Action("PartialA",new SomeModel()), viewName = "PartialA"});
}
else
{
return Json(new { Url = Url.Action("PartialB", new AnotherModel()),
viewName = "PartialB"});
}
}
https://stackoverflow.com/a/10266520/6842997
在视图中,获得结果后,您可以执行ajax帖子;
$.post(result.Url, function (partial) {
$('#div-a').html(partial);
});
为控制器中的每个Partialview添加PartialViewResults;
public PartialViewResult PartialA(SomeModel model)
{
return PartialView();
}
public PartialViewResult PartialB(AnotherModel model)
{
return PartialView();
}
然后在你的js中,做这样的事情;
<input type="submit" onclick="load()" value="submit" />
function load() {
$.ajax(
{
type: "POST",
url: "@Url.Action("LoadView", "Home")",
data: "",
success: function (result) {
if (result.viewName == "PartialA") {
$.post(result.Url, function (partial) {
$('#div-a').html(partial);
});
} else {
$.post(result.Url, function (partial) {
$('#div-b').html(partial);
});
}
}
});
}