- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我遇到一种情况,我需要从其部分 View 中调用 ParentView。就像我在部分 View 中有待办事项列表一样,其中 Ajax actionlink 用于通过传递其 id 来编辑父级中的数据。不使用 Ajax 也能实现同样的效果,因为它通过放置查询字符串来操作 url。但我们希望使用未触发的 Ajax 进行内部调用。
我们使用的代码是这样的:
<li>@Ajax.ActionLink(@item.ToDoTitle, "Index", new { tdid = @item.ToDoId }, new AjaxOptions { UpdateTargetId = "saved", InsertionMode = InsertionMode.Replace, HttpMethod="POST" })</li>
Controller 就像这样:
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();
}
}
我们尝试了同样的方法返回 View ,但没有发生任何事情,因此我们尝试使用 Json 作为它返回模型。
如果我错了请纠正我?
仅供引用,这是父 View :
@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") 调用的部分 View
@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>
Controller :
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
block ,它不是必需的)
<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);
});
});
Controller 方法是
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);
}
请注意,您在 View 中已经有了 ID 和 Title 属性,因此只需返回说明(我建议您按照此处的建议更改属性名称 - 即 ID
、 Title
和 Description
)
关于javascript - Asp.net MVC 使用 Ajax 从 PartialView 的操作链接加载父 View 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31096167/
有一个 ParentPage,它在右 Pane 中显示 PartialViewA。在 PartialViewA 中有一个下拉菜单。在选择特定值时,我想用 PartialViewB 替换 Partial
我的主页包含许多 PartialViews 这是我的 Index.cshtml @{ foreach (var summary in Model.Summaries)
我的代码在 VS2010 C# 中完美运行,但一旦发布到 IIS7,PartialView(记录列表)不会在 View 中呈现...它滚动到一个没有数据的新页面,除了从 SQL 检索的正确记录计数服务
我目前正在使用 ASP.NET MVC3 RC,并且正在使用不引人注目的 JQuery 验证,如 Brad Wilson 在 his blog 上所述。 。它工作得很好,但是当我将表单(在 Ajax
我正在开发 2 个 MVC5 网站。它们单独运行,但实际上彼此相关(1 个管理站点和 1 个用户站点)。在这两个站点中,我都必须使用 HTML 表格呈现图形板。我正在使用带有模型的 PartialVi
我正在使用 MVC4、C# 和 Razor 来制作一个简单的 Web 应用程序。 在我的 Controller 中,我有一个方法返回向用户显示的部分 View ,在本例中是模式弹出窗口: public
您好,我是 MVC 4 的新手。我遇到了partialView 的问题。我搜索了很多并研究了不同的教程,但找不到任何可以解决我的问题的解决方案。我创建了一个 PagedList 来显示记录在 Inde
我想获取标签的祖先标签。位于查看,删除位于部分 View 。 我可以通过 AJAX 将部分 View 加载到 View 中。但是,我无法采用部分 View 的祖先来操作部分 View ,在我的例子中,
我有部分 View ,我在 View 中使用 在这个partialView中我有切换开关 这是该开关的 css 文件 .switch { position: relative; dis
我将 MVC3 与 Jquery 的 .load() 和 PartialView() 结合使用。 通过我的 jquery,我正在执行以下操作: $("#stlist").load('@Ur
我在 ASP.NET MVC 页面上有一个 div,我想使用 jQuery 动态填充该 div(根据用户请求)。我目前使用 jQuery 对我的 Controller 进行 JSON 调用,该调用返回
我的PartialView是在View中渲染的,那么这个PartialView需要post controller,然后catch response,然后show。怎么做到的? 查看
我有一个索引页: @model AlfoncinaMVC.Models.VentaIndexViewModel @{ ViewBag.Title = "Ventas"; Layout
我有 MVC 应用程序,它用于从主视图 (ProductMaster) 将 ProductAreaGrid 列表显示为 PartialView,并且它将在局部 View 中将 CreateProduc
假设我像这样将数据传递给分部 View @Html.Partial("_LandingPage_CaseStudiesList", new { TrackAction = "Case Study Cl
我在 View 中使用 ajax 调用在 PartialView 中加载数据,而不会阻塞 UI。 $(function() { $.get( '@Url.Action("MyFunction
我有一个 Left 部分,其中包含我的特定页面的导航内容。 现在我想在其中显示一个 TreeView,因此我创建了一个局部 View 以将特定模型传递给该 View 。现在,我正尝试将该特定 View
我有一个显示“房间”对象的 HTML 表格的 View 。每个 Room 都是表中的一行(这是一个 PartialView)。 View 包含这段代码: @foreach (var item
我尝试设置一个小型演示,其中一篇文章有多个评论。文章详细信息 View ,应在部分 View 中呈现评论。 partialView 本身包含另一个用于添加新评论的局部 View 。 当我尝试添加另
我有一个 PartialView,其中包含带有 Razor 注释的 HTML 代码。它为我生成一个页面,我想通过电子邮件将其发送给任何人。有没有办法把这个PartialView翻译成HTML内容发送出
我是一名优秀的程序员,十分优秀!