一个MVC5网站,在一个Index页面中有一个文本框和一个按钮,要求点击按钮之后将文本框中的内容显示在文本框上方,同时页面其他元素保持不变。使用Ajax.BeginForm()方法时,也指定了要更新的元素id,但是运行的时候点击按钮就进到一个新的页面显示文本框中内容了。无法达到要求。请教一下怎么解决?谢谢!
附上代码:
public class HomeController : Controller { public ActionResult Index() { return View(); } [HttpPost] public ActionResult Index(string name) { return PartialView("Result", name); } }
<!-- Index.cshtml -->
<div id="content"> <div id="targetDiv"></div> @using (Ajax.BeginForm("Index", "Home", new AjaxOptions { UpdateTargetId = "targetDiv", InsertionMode = InsertionMode.Replace, })) { @Html.TextBox("name") <button type="submit" id="submit">submit</button> } </div>
<!-- Result. cshtml --> @{ string name = (string)Model; } @name
@if { string name=Request.QueryString["name"]; @Html.Partial("Result", name); } @Html.TextBox("name") <button type="submit" id="submit">submit</button>
<!-- Result. cshtml -->
<!-- Result. cshtml --> @Html.Raw( (string)Model)
那如果我想用post方式请求怎么处理?
@飞鸟_Asuka: Request.Form["name"];
@飞鸟_Asuka: 最好的方式是用ajax访问。
$.ajax({ type: "post", url: "/Home/Result", data: { name: name}, dataType: "html", success: function (data) { $("#data").html(data); }, error: function (textStatus) { window.location.href = "/Error/Index"; } });
@ArnoldZhang: 我在Index()方法中加入了如下语句
[HttpPost] public ActionResult Index(string name) { if(Request.IsAjaxRequest()) return PartialView("Result", name); return View(); }
很奇怪的是Request.IsAjaxRequest()方法的返回值是False! 但是我前端明明是用了Ajax辅助类啊,而且该引入的js文件都引入了
@飞鸟_Asuka: jquery.unobtrusive-ajax.min.js
这个js文件引用了吗??
webconfig中添加:
//Web.config <appSettings> <add key="ClientValidationEnabled" value="true" /> <add key="UnobtrusiveJavaScriptEnabled" value="true" /> </appSettings>
@ArnoldZhang: 都引用了啊,包括web.config中也有相应的配置代码
@飞鸟_Asuka: 是否用了jquery中的live,这个在有些版本中在chrome浏览器中报错的。
@飞鸟_Asuka: 如果坚持js没有报任何错,就把type: "post", 改成get请求方式试试。
@ArnoldZhang: 而且我看了下MVCMusicStore这个示例项目,也是同样的写法,但是那个就没有问题,自己从头开始写一遍就有问题
@飞鸟_Asuka: 有可能是版本的问题。
@ArnoldZhang: 不行,如果改成get方法就没有任何反应了,但是浏览器的console里也没有报错
@飞鸟_Asuka:
[HttpPost] public ActionResult Index(string name) { return PartialView("Result", name); } 这个当然要改成[HttpGet]
@ArnoldZhang: 改过了,不行
@ArnoldZhang: 奇怪了,我新建一个项目,重新编写了一遍代码,居然神奇地实现了我需要的功能。。。
还是谢谢你了,分数给你了
既然跳转了,那么就证明ajax未生效。请确认jquery, jquery.unobtrusive-ajax.min.js 等必须文件是否已引用,并生效。
我是从NuGet上获取的稳定版本,并且都引用了
你这需求直接用脚本就能完成,为什么要return PartialView("Result", name);,就算想用ajax返回页应该是jsonresult或者content什么的,返回partialview不跳才怪
如果是ajax的话,是不管返回值的。如果第二句话有误。