ASP.NET MVC - 执行控制器操作而不重定向

时间:2014-08-27 13:36:01

标签: asp.net-mvc

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

我所拥有的是以下内容: 我有一个_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局部视图中的内容,我认为我需要能够显示某种类型的通知(Possiblly使用PNotify添加为Bootstrap)。 MVC希望始终重定向到../播放列表/ AddSong?playlistId = 1&amp; songId = 1

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

3 个答案:

答案 0 :(得分:7)

如果您不想要&#34;整页重新加载&#34;然后你需要稍微区别地解决问题,使用javascript动态地改变页面。像JQuery这样的库可能会使DOM更容易操作。

  1. 使用javascript动态显示弹出窗口。
  2. 当用户在弹出窗口中点击OK / Submit时,使用javascript将数据发回服务器,并让你发布的控制器返回一些HTML。
  3. 将返回的HTML块(部分视图)附加到包含播放列表轨道的现有div。
  4. 最困难的部分是asynchronous post。有关更新div而无需重新加载整个页面的帮助,请参见this question

    编辑 - 示例

    如果您使用网址myapp.com/PlayList/AddSong/进行控制器操作(接受POSTs),则您需要设置JQuery以发布到此网址。您还可以使用您要发布的任何表单数据设置data媒体资源,在您的情况下,您需要添加playistIdsongId data属性。

    然后,您将使用AJAX查询(HTML)的结果并将其附加到页面上的现有播放列表HTML中。因此,假设您要将部分视图的HTML附加到ID为playlistDiv的div,并假设您的部分视图返回HTML,该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版本可能存在差异等,但稍微调整一下就可以达到预期的效果。

答案 1 :(得分:0)

  • 使用System.Web.Mvc;
  • 使用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();
    }
    

答案 2 :(得分:0)

在控制器中,您必须添加底部代码:

public ActionResult Index(string msg)
        {
            if (Request.Url.ToString().ToLower().Contains("yourNewExampleUrlWithOutRedirect.com"))
            {
                string html = "";
                using (System.Net.WebClient client = new System.Net.WebClient())
                {
                    client.Encoding = Encoding.UTF8;
                    html = client.DownloadString("https://NewExampleUrl.com/first/index?id=1");
                }
                Response.Write(html);
            }
...
}

您的视图必须为空,以便添加底部代码

    @{

        ViewBag.Title = "سامانه مدارس مدیار - مدرسه هوشمند - اپلیکیشن هوشمندسازی مدارس - اپلیکیشن مدرسه";
        if (Request.Url.ToString().Contains("yourNewExampleUrlWithOutRedirect.com"))
        {
            Layout = null;
        }else
        {
            Layout ="~/Views/Shared/_Layout.cshtml"
        }
    }
    @if (Request.Url.ToString().Contains("yourNewExampleUrlWithOutRedirect.com")==false)
    {
    before view like :
<div>hello world</div>
    }