Asp.net MVC使用Ajax从PartialView的actionlink加载父视图不起作用
Asp.net MVC Loading Parent View from the actionlink of PartialView using Ajax not working
我有一种情况,需要从ParentView的局部视图调用它。就像我在Partial视图中有ToDos列表一样,Ajax操作链接用于通过传递id来编辑父级中的数据。在不使用Ajax的情况下,它也可以通过放入querystring来操作url。但我们希望与Ajax进行内部通话,Ajax不会开火。
我们使用的代码如下:
<li>@Ajax.ActionLink(@item.ToDoTitle, "Index", new { tdid = @item.ToDoId }, new AjaxOptions { UpdateTargetId = "saved", InsertionMode = InsertionMode.Replace, HttpMethod="POST" })</li>
控制器是这样的:
public ActionResult Index(int tdid =0)
{
if (tdid !=0)
{
ToDo t = new ToDo();
t.ToDoTitle = "Ramlal";
t.ToDoDesc = "Shyamlal";
t.ToDoId = tdid;
return Json(t);
}
else
{
return View();
}
}
我们也尝试过返回视图,但没有发生任何事情,所以我们尝试使用Json作为它的返回模型。
如果我错了,请纠正我?
仅供参考,这是父视图:
@model myTask.Models.ToDo
@{
ViewBag.Title = "My Task";
}
<script src="~/Scripts/jquery-1.10.2.min.js"></script>
<script src="~/Scripts/jquery.unobtrusive-ajax.min.js"></script>
@using (Ajax.BeginForm("Save", new AjaxOptions() { InsertionMode = InsertionMode.Replace, UpdateTargetId = "MyTaskList" }))
{
@Html.AntiForgeryToken()
<div class="MyTask">
@Html.HiddenFor(t => t.ToDoId)
<div class="row">
<div class="col-lg-12">
@Html.LabelFor(t => t.ToDoTitle)<br />
@Html.TextBoxFor(t => t.ToDoTitle)
</div>
<div class="col-lg-12">
@Html.LabelFor(t => t.ToDoDesc)<br />
@Html.TextAreaFor(t => t.ToDoDesc)
</div>
</div>
<script>
$( "#ToDoTitle" ).blur( function() {
$.ajax({
url: "Save",
type: "POST",
data: $("#form0").serialize(),
dataType: "json"
}).done(function (model) {
$("#ToDoId").val(model.ToDoId);
$("#ToDoTitle").val(model.ToDoTitle);
$("#ToDoDesc").val(model.ToDoDesc);
});
});
$("#ToDoDesc").blur(function () {
if ($("#ToDoId").val() > 0) {
$.ajax({
url: "Save",
type: "POST",
data: $("#form0").serialize(),
dataType: "json"
}).done(function (model) {
$("#ToDoId").val(model.ToDoId);
$("#ToDoTitle").val(model.ToDoTitle);
$("#ToDoDesc").val(model.ToDoDesc);
});
}});
</script>
</div>
<div class="ObjectList" id="MyTaskList">
@Html.Action("TodoList")
</div>
<div class="clearfix"></div>
}
这是使用@Html.Action("TodoList")调用的部分视图
@using System.Linq
@model myTask.Models.ToDoList
@{
ViewBag.Title = "Index";
}
<script src="~/Scripts/jquery-1.10.2.min.js"></script>
<script src="~/Scripts/jquery.unobtrusive-ajax.min.js"></script>
<div class="row">
@if (Model.ToDos.Count > 0)
{
<ul>
@foreach (var item in Model.ToDos)
{
@*<li>@Html.ActionLink(@item.ToDoTitle, "Index", new { tdid = @item.ToDoId })</li>*@
<li>@Ajax.ActionLink(@item.ToDoTitle, "/Index", new { tdid = @item.ToDoId }, new AjaxOptions { UpdateTargetId = "MyTask", InsertionMode = InsertionMode.Replace, HttpMethod = "POST" })</li>
}
</ul>
}
</div>
控制器:
using myTask.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Web;
using System.Web.Mvc;
namespace myTask.Controllers
{
public class TasktdController : Controller
{
// GET: Tasktd
public ActionResult Index(int tdid =0)
{
if (tdid !=0)
{
ToDo t = new ToDo();
t.ToDoTitle = "Ramlal";
t.ToDoDesc = "Shyamlal";
t.ToDoId = tdid;
return PartialView(t);
}
else
{
return View();
}
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Save(ToDo td)
{
var errors = ModelState.Values.SelectMany(v => v.Errors);
ModelState.Remove("ToDoId");
if (ModelState.IsValid)
{
var t = await td.Save(td);
return Json(td);
}
return Json("Oops! Error Occured");
}
[ChildActionOnly]
public PartialViewResult TodoList()
{
ToDoList tdl = new ToDoList();
List <ToDo> tds= new List<ToDo>();
ToDo t = new ToDo();
t.ToDoId = 1;
t.ToDoTitle = "XXX";
tds.Add(t);
tdl.ToDos = tds;
return PartialView(tdl);
}
}
}
您的代码有很多问题。首先,您使用.ajax()
提交表单,但表单甚至没有提交按钮!更换
@using (Ajax.BeginForm("Save", new AjaxOptions() { ... })
{
....
}
带有
<form id="form">
.... // add controls for properties
<button id="save" type="button">Save</button>
</form>
删除$( "#ToDoTitle" ).blur()
和$("#ToDoDesc").blur()
的脚本并替换为
<script>
var form = $('#form');
var saveUrl = '@Url.Action("Save")';
$.post(saveUrl, form.serialize(), function(data) {
if(data) {
// save successful - give the user some feedback
}
}).fail(function (result) {
// Oops and error occurred - give the user some feedback
});
.... // add script for editing here (see below0
</script>
您当前的脚本会导致性能不佳,并且是糟糕的UI设计的结果。用户应该决定何时保存(即单击按钮),而不是您。考虑一下,如果用户编辑了描述的标题和选项卡,然后意识到所有内容都是正确的,根本不需要更改任何内容(您的代码已经更改了数据库中的数据,用户甚至不知道)
请注意,脚本应该紧跟在关闭</body>
标记之前(不是内联)。如果成功保存了对象,则Save()
方法应返回Json(true)
。
要处理点击"链接",请将部分更改为(注意不需要@if
块)
<ul>
@foreach (var item in Model.ToDos)
{
<li>
<span>@item.ToDoTitle</span>
<button class="edit" type="button" data-id="@item.@item.ToDoId">Edit</button>
</li>
}
</ul>
如果你想让按钮看起来像一个链接,那么使用css将其设置为
然后在主视图中添加另一个脚本
var editUrl = '@Url.Action("Get")';
$('.edit').click(function() {
var id = $(this).data('id');
var title = $(this).prev('span').text();
$.getJSON(editUrl, { id: id, function(data) {
// Populate form fields
$('#ToDoId').val(id);
$('#ToDoTitle').val(title);
$('#ToDoDesc').val(data);
});
});
控制器的方法是
public JsonResult Get(int id)
{
// Look up the Description based on the id, for example
string description = db.ToDo.Where(x => x.ToDoId == id).Select(x => x.ToDoDesc);
return Json(description, JsonRequestBehavior.AllowGet);
}
请注意,视图中已经有ID和Title属性,因此只需要返回Description(我建议您按照此处的建议更改属性名称,即ID
、Title
和Description
)
- 如何使用url加载程序在webpack中导入多个图像
- 如何在生成下载文件时显示加载动画
- 有没有任何方法可以将控制器从文件加载到ui路由器$stateProvider中
- 无法在通过jQuery的ajax加载的页面中执行javascript
- Emberjs应用程序加载在除Index之外的所有路由上
- 在chrome.tabs.onCreated之后加载HTML页面
- 单击F5时如何停止页面加载
- HTML5音频加载和播放获胜'我不能在iPad上工作
- 跟踪在页面加载时应用内联样式的JavaScript
- 在使用Polymer'加载所有json文件后执行方法;s的核心ajax
- jQuery Lazy加载动画滚动
- Html页面上的多个Base64图像和平滑加载
- 如何创建带有插槽的vue js组件预加载程序
- Webpack/Rect:遵循egghead.io教程,但出现错误:您可能需要一个合适的加载程序来处理此文件类型
- 如何使该数据在所有元素中加载
- Chrome扩展没有't在重新加载之前考虑期权价值
- 使用javascript在Flash中加载外部图像
- Ajax文件加载和<输入>文件加载
- 使用javascript函数在页面初始化后加载jquery
- Asp.net MVC使用Ajax从PartialView的actionlink加载父视图不起作用