2014-08-27 58 views
7

我想在控制器上执行操作而不重定向到该操作的相关视图。有关我想要实现的一个很好的例子,请查看music.xbox.com网站。当您从弹出式菜单向选定的播放列表中添加歌曲时 - 该页面只显示没有任何重定向或刷新的通知。这怎么可能?ASP.NET MVC - 执行控制器操作而不重定向

我有如下: 我有呈现播放列表如下:a _playlistPopupMenu局部视图:

_PlaylistPopupMenu

@model List<OneMusic.Models.GetPlaylists_Result> 
@if (Model.Count > 0) 
{ 
    <li style="height:2px" class="divider"></li> 
    foreach (var item in Model) 
    { 
     <li style="height:30px">@Html.DisplayFor(p => item.Name) 
      @Html.ActionLink(item.Name, "AddSong", "Playlist", new { playlistId = @item.PlaylistId, songId = 1 }, "") 
     </li> 
    } 
} 

的PlaylistController AddSong操作如下:

public PartialViewResult AddSong(int? playlistId, int? songId) 
{ 
    if (ModelState.IsValid) 
    { 
     db.AddSongToPlaylist(playlistId, songId); 
     db.SaveChanges(); 
     return PartialView("_AddToPlaylist", ""); 
    } 
    return PartialView("_AddToPlaylist", ""); 
} 

我正在努力与_AddToPlaylist局部视图,我认为我需要能够显示打出某种类型的通知(可能使用PNotify添加进Bootstrap)。 MVC希望总是重定向到../Playlist/AddSong?playlistId=1 & songId = 1

关于如何完成问题的最后部分的任何想法都会很棒。

+1

这不是重定向(HTTP 3XX),它返回一个局部视图。您应该考虑通过javascript使用AJAX请求,使请求异步,处理响应并在当前页面中呈现您需要的内容。 – 2014-08-27 13:41:13

+0

如上所述,您需要动态呈现页面的某些部分(使用AJAX请求)。请参阅http://stackoverflow.com/questions/11134701/jquery-load-part-of-external-html了解一个想法。 – 2014-08-27 13:58:58

回答

6

如果你不想“整页重新加载”,那么你需要稍微不同的问题来解决问题,使用javascript来动态改变页面。诸如JQuery之类的库可能会使得操作DOM更容易一些。

  1. 使用javascript动态显示弹出窗口。
  2. 当用户在弹出窗口中点击确定/提交时,使用javascript将数据发送回服务器,并让您发布的控制器返回一些HTML。
  3. 将返回的HTML块(局部视图)附加到包含播放列表轨道的现有div。

这个最难的部分是asynchronous post。帮助更新div而不重新加载整个页面可以在this question中找到。

编辑 - 实例

如果你有一个控制器行动的URL myapp.com/PlayList/AddSong/(接受POSTs),那么你会设立的JQuery张贴到这个网址。您还可以设置data属性,并在其中添加您想要发布的任何表单数据,如果您要将playistIdsongId添加到data属性中,

然后,您将使用AJAX查询(HTML)的结果并将其附加到页面上现有的播放列表HTML中。因此,假如要在局部视图的HTML追加到ID为playlistDiv一个div,并假设您的局部视图返回HTML时附加到现有的播放列表是有效的,那么你的JavaScript将是这个样子:

var data = { playlistId = 1, songId = 1 }; 
$.ajax({ 
    type: "POST", 
    url: 'http://myapp.com/PlayList/AddSong/', 
    data: data, 
    success: function(resultData) { 
     // take the result data and update the div 
     $("#playlistDiv").append(resultData.html) 
    }, 
    dataType: dataType 
}); 

声明:我不能保证此代码将100%工作(除非我自己编写程序)。您使用的JQuery版本可能存在差异,但是稍加调整即可达到预期的效果。

+0

非常感谢。你能稍微扩大一点步骤2和3。 – AndrewJE 2014-08-27 15:53:21

+0

非常感谢。得到它的工作。 – AndrewJE 2014-08-28 08:52:04

+0

好东西!这是一个非常有用的模式,您可以将其应用于很多页面... – 2014-08-28 08:58:25

0
  • using System.Web.Mvc;
  • using System.Web.Mvc.Html;

    public ActionResult Index() 
    { 
        HtmlHelper helper = new HtmlHelper(new ViewContext(ControllerContext, new WebFormView(ControllerContext, "Index"), new ViewDataDictionary(), new TempDataDictionary(), new System.IO.StringWriter()), new ViewPage()); 
        helper.RenderAction("Index2"); 
    
        return View(); 
    } 
    
    public ActionResult Index2(/*your arg*/) 
    { 
        //your code 
        return new EmptyResult(); 
    } 
    
相关问题