我找了很长时间来解决这个问题,但我找不到任何东西。我已经将强类型定义为我正在使用的控制器/视图的模型;问题是模型引用了其他复杂类型,因此我需要部分更新该模型的部分。例如,在页面的一个选项卡中,我获得了另一个视图,该视图为网格带来了一些选择;另一部分带来另一部分;所以在用户选择他们的选项并提交后,我需要将所有这些小块发送到后期操作。
我已经创建了我需要的JSON对象并将其发送给控制器。在动作中,我成功地获得了模型,但JSON没有采取行动。那么我如何将该JSON作为控制器动作的附加参数传递给视图?
我也已经用fiddler检查了请求,并且正在发送JSON。对象是否在特殊集合中传递?
不确定。视图期望或强烈键入模型,在这种情况下是“提供者”实体。该实体具有原始类型和复杂类型。当实体仍在创建过程中时,我需要传递部分对象以在到达后创建动作时完成实体。 这是该模型的一部分:
public class Provider2 : IProvider
{
public int Id { get; set; }
public bool IsApproved { get; set; }
public string RejectionNotes { get; set; }
public string Name { get; set; }
public string Phone { get; set; }
public string Fax { get; set; }
public string Email { get; set; }
public int OfficeAddressId { get; set; }
public virtual Address Address { get; set; }
public virtual ICollection<Chain> ProviderChain { get; set; }
public virtual ICollection<ProviderContact> ProviderContacts { get; set; }
public virtual ICollection<ExaminationPrice> ExaminationPrices { get; set; }
}
简单类型(例如整数,字符串等)没有问题。 正如您所看到的,有集合和复杂类型,这些类型是从部分视图中检索出来的,那个时刻是独立的实体,因此我需要在提交时将它们包装在json或其他对象(如JSON)中并获取它到达创建操作的那一刻:
[HttpPost]
public ActionResult Create(Provider provider, Another object to be passed???)
{
if (ModelState.IsValid)
{
_repository.Save(provider);
return RedirectToAction("Index");
}
return View(provider);
}
原始类型和addres属性在模型中映射,所以它们没有问题,但是集合没有被映射,所以这就是我尝试传递aditional对象如json以包装所有部分的原因从纯HTML到javascript对象,因为它们没有直接映射到模型。
所以,通过这个javascript我发送的数据我需要的视图和它的发送,但显然该动作没有收到json对象。
$(function () {
$("#ButtonSave").click(function () {
var prices = getPrices();
if (prices != null) {
$.ajax({
url: '/Provider/Create',
type: 'POST',
dataType: 'json',
data: prices,
contentType: 'application/json; charset=utf-8',
success: function (data) {
alert('Success');
}
});
}
});
});
function getPrices() {
var elements = '[';
var rows = $("#selectedElementsGrid tr.selectable").each(function () {
var idValue = '{price : { "Id":' + $(this).find(".id").val() + ',';
var nameValue = ' "Name":"' + $(this).find(".name").text() + '",';
var priceValue = ' "Price":"' + $(this).find(".price").val() + '"} },';
elements = elements + idValue + nameValue + priceValue;
});
elements = elements.substring(0, elements.length - 1) + ']';
return JSON.stringify(elements);
}
提前致谢!
答案 0 :(得分:0)
您发布的json对象是字符串(稍后您可以使用JavaScriptSerializer的方法对其进行反序列化)。
我认为,你缺少的是你在jquery ajax调用中作为数据放置的价格变量的关键。
帖子通常由键值对列表组成,这也是允许服务器技术从发布的数据重建和对象的内容。在您的情况下,只有价格变量。
尝试将其更改为数据:{PricesListAsString:prices},并在服务器上将“要传递的另一个对象”更改为字符串PricesListAsString。
当然,您还可以在调试控制器时检查Request对象,以查看已发布值如何传递到服务器
答案 1 :(得分:0)
对MVC3框架有很多了解我发现你可以将所需的参数传递给控制器动作,关键是要保持对模型和请求的良好处理。 另外我发现最简单的方法是通过JSON,首先用你需要的参数定义你的控制器动作:
[HttpPost]
public ActionResult AddContact(Contact contact, int Id)
{
var globalType = _repository.FindOne(p => p.Id == Id);
if (globalType.Contacts == null)
{
globalType.Contacts = new List<Contact>();
}
globalType.Contacts.Add(contact);
return View("Index", globalType);
}
然后从标记中定义一个将传递参数的复杂JSON:
var contact = { Id: $('#FieldId').val(),
Notes: $('#ContactNotes').val(),
Name: $('#ContactName').val(),
Phone: $('#Phone').val(),
Fax: $('#Fax').val(),
Email: $('#Email').val(),
OfficeAddress: { Country: $('#Country').val(),
State: $('#State').val()
ZipCode: $('#ZipCode').val()
}
};
$.ajax({
url: '/Contact/Edit',
contentType: 'application/json; charset=utf-8',
type: 'POST',
dataType: 'json',
data: JSON.stringify(contact)
})
.success(function (result) {
// Display the section contents.
alert('Contact updated succesfully!');
window.location.href = result.Url;
})
.error(function (xhr, status) {
alert('The provider could not be updated.');
});
请注意,Id参数的调用与action方法中的相同。复杂类型由MVC框架自动推导,唯一的条件是属性必须命名相同。
实现相同结果的另一种方法是使用2种不同的JSON类型来定义控制器操作,这是一个例子。
控制器操作:
[HttpPost]
public ActionResult AddContact(TypeA typeA, TypeB typeB)
{
//Some logic...
}
JSON:
var _typeA = { Id: $('#FieldId').val(),
Name: $('#ContactName').val()
};
var _typeB = { Id: $('#FieldId').val(),
Name: $('#ContactName').val()
};
$.ajax({
url: '/Controller/Action',
contentType: 'application/json; charset=utf-8',
type: 'POST',
dataType: 'json',
data: {typeA:JSON.stringify(_typeA)},{typeB:JSON.stringify(_typeB)}
})
.success(function (result) {
// Display the section contents.
alert('Contact updated succesfully!');
window.location.href = result.Url;
})
.error(function (xhr, status) {
alert('The provider could not be updated.');
});
希望这能帮到你