MVC Ajax局部视图 - 根据返回的视图加载到不同的div中

时间:2016-10-07 00:23:48

标签: jquery html ajax asp.net-mvc partial-views

有没有办法根据从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更黑。

2 个答案:

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