【问题标题】:How to update partial view from another partial view via action results如何通过操作结果从另一个局部视图更新局部视图
【发布时间】:2016-04-26 13:01:02
【问题描述】:

我对主视图有三个部分视图

在第一个局部视图上,我有搜索功能,当用户单击搜索时,我想将结果刷新到第三个局部视图。

控制器:

public ActionResult Search()
{  
         virtualmodel vm = new virtualmodel(); 
      return PartialView(svm);

} 

[HttpPost]
public ActionResult Search(ViewModel svm)
{  
         // Query to retrive the result 
      // I am not sure what to return from here. Link to another action    or just return back to same same partial 

} 

public ActionResult AnotherPartialPartial()
{
}

在主视图中

 @{Html.RenderAction("Search", "Searchc");
  }

怎么做?我需要ajax吗?

【问题讨论】:

  • 如果您不想重新加载整个页面 - 那么您需要 ajax。如果你没问题 - 你可以使用常规形式的帖子
  • ajax 是最简单的方法。
  • 绝对是ajax
  • 尽管有些人真的试图帮助我,但我仍然无法找到可行的解决方案:(
  • @Nil 你解决了吗?如果你解决了,解决方案是什么?

标签: c# ajax asp.net-mvc asp.net-mvc-4 partial-views


【解决方案1】:

使用 ajax,您可以调用控制器操作并将其响应返回到特定的div

div:

<div class="row" id="div3">

</div>

Ajax 以空 div 显示 html:

function performSearch(searchCriteria) {
   //get information to pass to controller
   var searchInformation = JSON.stringify(**your search information**);

            $.ajax({
                url: '@Url.Action("Search", "ControllerName")',//controller name and action 
                type: 'POST',
                data: { 'svm': searchInformation } //information for search
            })
            .success(function (result) {
                $('#div3').html(result); //write returned partial view to empty div
            })
            .error(function (xhr, status) {
                alert(status);
            })
        }

【讨论】:

  • 抱歉,我无法理解在数据旁边放什么
  • svm 是我操作结果中的一个对象,我需要参考添加该对象吗?
  • 对不起,我试图让它更接近你的问题,我错过了那部分,现在更新
  • 看起来您的搜索操作将 svm 作为参数,这就是我将其放在那里的原因。您调用什么操作来执行搜索并返回部分视图?
  • 我正在调用 SearchMenu actionresult 来获取搜索结果,并将该结果传递给 ListPartial 方法
【解决方案2】:

jQuery 将帮助您! 尝试像这样处理提交按钮 onclick 事件:

$("#yourButtonId").click(function()
{
   $.ajax({
      type: "POST",
                url: "/yourUrl", //in asp.net mvc using ActionResult
                data: data,
                dataType: 'html',
                success: function (result) {
              //Your result is here
              $("#yourContainerId").html(result);
      }
   });
});

【讨论】:

  • 我不知道为什么,但这对我不起作用。我的按钮在部分视图上,而 div 在主视图上
  • @Nil 尝试添加加载或重新加载 window.reload(); $("#yourContainerId").html(result); 之后的函数如果它有帮助,请检查修复thanx
  • 我这样写的 $("#showFloors").html(result); window.reload();但还是没有
  • @Nil 您可以在这里获得有关此解决方案的一些信息 ;) stackoverflow.com/questions/16014129/…
【解决方案3】:

你可以用 ajax 来做。

首先,将视图中的 html.beginform 更改为 ajax.beginform 并将 div id 添加到要更改内容的 UpdateTargetId 中。使用 ajax.beginform 更新第一个部分视图后,您可以使用 ajax.beginform 的 "OnSuccess" 函数更新其他部分视图。您必须添加这样的更新功能:

@using (Ajax.BeginForm("YourAction", "YourController", 
        new { /*your objects*/ }, new AjaxOptions { HttpMethod = "POST", InsertionMode = InsertionMode.Replace, 
        UpdateTargetId = "ChangeThisPart", OnSuccess = "OnSuccessMethod" }))
        {
           /*your code*/
        }

<script>
   function OnSuccessMethod() {
      $("#YouWantToChangeSecondDivID").load('/YourController/YourAction2');
      $("#YouWantToChangeThirdDivID").load('/YourController/YourAction3');
   };
</script>

然后在您的控制器中,返回一个局部视图以刷新您在 UpdateTargetId 值中输入其 ID 的视图部分:

public ActionResult YourControllerName(YourModelType model)
{
   ...//your code
   return PartialView("_YourPartialViewName", YourViewModel);
}

注意:在使用 ajax 时不要忘记在视图中添加对“jquery.unobtrusive-ajax.min.js”的引用。

【讨论】:

  • 但我有 3 个部分视图。我想现在和以后定期更新第 3 部分视图 我想更新第 2 部分视图,它仍然有效吗?
  • 我已经更新了更新多个局部视图的答案。
  • 对象?哪个对象?一个将传递给控制器​​?
  • 是的。如果要添加其他对象以传递给控制器​​,可以在该字段中添加它们。但如果你不想要它,你不必使用它。
  • 我试过这样的东西 "@using (Ajax.BeginForm("SearchMenu", "Search", new { /*your objects*/ }, new AjaxOptions { HttpMethod = "POST", InsertionMode = InsertionMode.Replace, UpdateTargetId = "ChangeThisPart", OnSuccess = "OnSuccessMethod" })) { Html.RenderAction("SearchMenu", "Search");
    } " 它没有工作吧
【解决方案4】:

所以,假设您的 View 带有 PartialView,必须通过单击按钮来更新:

<div class="target">
 @{ Html.RenderAction("UpdatePoints");}
</div>

<input class="button" value="update" />

有一些方法可以做到这一点。例如,您可以使用 jQuery:

<script type="text/javascript">
    $(function(){    
        $('.button')click(function(){        
            $.post('@Url.Action("PostActionToUpdatePoints", "Home")').always(function(){
                $('.traget').Load('/Home/UpdatePoints');        
            })        
        });
    });        
</script>

PostActionToUpdatePoints 是带有 [HttpPost] 属性的 Action,用于更新点

如果您在操作 UpdatePoints() 中使用逻辑来更新点,可能是您忘记为其添加 [HttpPost] 属性:

[HttpPost]
public ActionResult UpdatePoints()
{    
    ViewBag.points =  _Repository.Points;
    return PartialView("UpdatePoints");
}

【讨论】:

  • 嘿,谢谢,我正在尝试以这种方式进行操作,但是现在出现了一个新错误,对于 @{Html.RenderAction("SearchMenu", "Search");} 它给出了一个错误 System.Web.Mvc.HttpHandlerUtil+ServerExecuteHttpHandlerAsyncWrapper
  • 我不知道我错在哪里,但它说空异常
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-01
相关资源
最近更新 更多