我正在尝试在控制器上执行操作,而不会重定向到该操作的关联视图。有关我想要实现的一个很好的例子,请查看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
关于如何完成问题的最后部分的任何想法都会很棒。
答案 0 :(得分:7)
如果您不想要&#34;整页重新加载&#34;然后你需要稍微区别地解决问题,使用javascript动态地改变页面。像JQuery这样的库可能会使DOM更容易操作。
最困难的部分是asynchronous post。有关更新div而无需重新加载整个页面的帮助,请参见this question。
编辑 - 示例
如果您使用网址myapp.com/PlayList/AddSong/
进行控制器操作(接受POSTs),则您需要设置JQuery以发布到此网址。您还可以使用您要发布的任何表单数据设置data
媒体资源,在您的情况下,您需要添加playistId
和songId
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.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>
}