我是一名新手网络程序员,如果我的某些“行话”不正确,请原谅我。 我有一个使用ASP.NET使用MVC3框架的项目。
我正在管理视图,管理员将修改设备列表。其中一个功能是“更新”按钮,我希望在向MVC控制器发送帖子后使用jquery动态编辑网页上的条目。
我认为这种方法在单一管理设置中是“安全的”,因为网页与数据库不同步的担忧很少。
我创建了一个强类型的视图,并且希望使用AJAX帖子将模型数据传递给MVC控件。
在下面的帖子中,我发现了一些类似于我正在做的事情: JQuery Ajax and ASP.NET MVC3 causing null parameters
我将使用上述帖子中的代码示例。
型号:
public class AddressInfo
{
public string Address1 { get; set; }
public string Address2 { get; set; }
public string City { get; set; }
public string State { get; set; }
public string ZipCode { get; set; }
public string Country { get; set; }
}
控制器:
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
[HttpPost]
public ActionResult Check(AddressInfo addressInfo)
{
return Json(new { success = true });
}
}
视图中的脚本:
<script type="text/javascript">
var ai = {
Address1: "423 Judy Road",
Address2: "1001",
City: "New York",
State: "NY",
ZipCode: "10301",
Country: "USA"
};
$.ajax({
url: '/home/check',
type: 'POST',
data: JSON.stringify(ai),
contentType: 'application/json; charset=utf-8',
success: function (data.success) {
alert(data);
},
error: function () {
alert("error");
}
});
</script>
我还没有机会使用上述内容。但我想知道这是否是使用AJAX将模型数据传递回MVC控件的“最佳”方法?
我是否应该关注公开模型信息?
答案 0 :(得分:169)
我找到了3种实现方法:
C#class:
public class AddressInfo {
public string Address1 { get; set; }
public string Address2 { get; set; }
public string City { get; set; }
public string State { get; set; }
public string ZipCode { get; set; }
public string Country { get; set; }
}
行动:
[HttpPost]
public ActionResult Check(AddressInfo addressInfo)
{
return Json(new { success = true });
}
JavaScript 您可以通过以下三种方式完成:
1)查询字符串:
$.ajax({
url: '/en/Home/Check',
data: $('#form').serialize(),
type: 'POST',
});
这里的数据是一个字符串。
"Address1=blah&Address2=blah&City=blah&State=blah&ZipCode=blah&Country=blah"
2)对象数组:
$.ajax({
url: '/en/Home/Check',
data: $('#form').serializeArray(),
type: 'POST',
});
此处的数据是一组键/值对:
=[{name: 'Address1', value: 'blah'}, {name: 'Address2', value: 'blah'}, {name: 'City', value: 'blah'}, {name: 'State', value: 'blah'}, {name: 'ZipCode', value: 'blah'}, {name: 'Country', value: 'blah'}]
3)JSON:
$.ajax({
url: '/en/Home/Check',
data: JSON.stringify({ addressInfo:{//missing brackets
Address1: $('#address1').val(),
Address2: $('#address2').val(),
City: $('#City').val(),
State: $('#State').val(),
ZipCode: $('#ZipCode').val()}}),
type: 'POST',
contentType: 'application/json; charset=utf-8'
});
此处的数据是序列化的JSON字符串。请注意,名称必须与服务器中的参数名称匹配!!
='{"addressInfo":{"Address1":"blah","Address2":"blah","City":"blah","State":"blah", "ZipCode", "blah", "Country", "blah"}}'
答案 1 :(得分:69)
您可以跳过var声明和stringify。否则,这将工作得很好。
$.ajax({
url: '/home/check',
type: 'POST',
data: {
Address1: "423 Judy Road",
Address2: "1001",
City: "New York",
State: "NY",
ZipCode: "10301",
Country: "USA"
},
contentType: 'application/json; charset=utf-8',
success: function (data) {
alert(data.success);
},
error: function () {
alert("error");
}
});
答案 2 :(得分:12)
这是我的工作方式:
$.post("/Controller/Action", $("#form").serialize(), function(json) {
// handle response
}, "json");
[HttpPost]
public ActionResult TV(MyModel id)
{
return Json(new { success = true });
}
答案 3 :(得分:8)
你所拥有的一切都很好 - 但是为了节省一些打字,你可以简单地使用你的数据
data: $('#formId').serialize()
请参阅http://www.ryancoughlin.com/2009/05/04/how-to-use-jquery-to-serialize-ajax-forms/了解详细信息,语法非常基本。
答案 4 :(得分:0)
如果使用MVC 5阅读此解决方案!
我知道专门针对MVC 3的问题,但我偶然发现了MVC 5的这个页面,并希望在我的情况下为其他人发布解决方案。我尝试了上述解决方案,但它们对我不起作用,动作过滤器从未到达,我无法弄清楚原因。我在我的项目中使用版本5,最后得到以下操作过滤器:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Filters;
namespace SydHeller.Filters
{
public class ValidateJSONAntiForgeryHeader : FilterAttribute, IAuthorizationFilter
{
public void OnAuthorization(AuthorizationContext filterContext)
{
string clientToken = filterContext.RequestContext.HttpContext.Request.Headers.Get(KEY_NAME);
if (clientToken == null)
{
throw new HttpAntiForgeryException(string.Format("Header does not contain {0}", KEY_NAME));
}
string serverToken = filterContext.HttpContext.Request.Cookies.Get(KEY_NAME).Value;
if (serverToken == null)
{
throw new HttpAntiForgeryException(string.Format("Cookies does not contain {0}", KEY_NAME));
}
System.Web.Helpers.AntiForgery.Validate(serverToken, clientToken);
}
private const string KEY_NAME = "__RequestVerificationToken";
}
}
- 记下using System.Web.Mvc
和using System.Web.Mvc.Filters
,而不是http
库(我认为这是MVC v5发生的变化之一。 -
然后只需将过滤器[ValidateJSONAntiForgeryHeader]
应用于您的操作(或控制器),就可以正确调用它。
在</body>
上方的布局页面中,我有@AntiForgery.GetHtml();
最后,在我的Razor页面中,我按如下方式进行ajax调用:
var formForgeryToken = $('input[name="__RequestVerificationToken"]').val();
$.ajax({
type: "POST",
url: serviceURL,
contentType: "application/json; charset=utf-8",
dataType: "json",
data: requestData,
headers: {
"__RequestVerificationToken": formForgeryToken
},
success: crimeDataSuccessFunc,
error: crimeDataErrorFunc
});