Asp.net mvc MVC3-使用AJAX将动态表单数据发回服务器
我正在为我公司的服务开发一个数据库输入系统。每个服务可以根据需要有任意多个操作。同样,每个操作可以根据需要具有任意多的参数。我试图做的是使用动态表单在我的服务/编辑视图中更新操作参数的数据 我使用动态表单向服务中添加操作,但不是从我的服务视图中发布操作,而是从操作/创建中发布操作。这不应该是个问题,但我想我应该指出这一点Asp.net mvc MVC3-使用AJAX将动态表单数据发回服务器,asp.net-mvc,model-binding,mvc-editor-templates,dynamic-forms,asp.net-mvc-partialview,Asp.net Mvc,Model Binding,Mvc Editor Templates,Dynamic Forms,Asp.net Mvc Partialview,我正在为我公司的服务开发一个数据库输入系统。每个服务可以根据需要有任意多个操作。同样,每个操作可以根据需要具有任意多的参数。我试图做的是使用动态表单在我的服务/编辑视图中更新操作参数的数据 我使用动态表单向服务中添加操作,但不是从我的服务视图中发布操作,而是从操作/创建中发布操作。这不应该是个问题,但我想我应该指出这一点 现在,我遇到的问题是将参数表单中的数据发回服务器。ModelState.isValid返回false。查看modelstate时,所有服务数据成员和操作数据成员都在那里,但所有
现在,我遇到的问题是将参数表单中的数据发回服务器。ModelState.isValid返回false。查看modelstate时,所有服务数据成员和操作数据成员都在那里,但所有参数数据成员都丢失了。我使用FormCollection检查动态表单的名称,它们实际上遵循MVC的模型绑定命名约定(参数[I].DataMembers) 希望有人能为我提供一些见解。下面是一些可能有用的代码: 在我的服务控制器中:
public ActionResult Edit(int id = 0)
{
if (id == 0)
{
return HttpNotFound();
}
//Eager loads the operations and parameters for this service
var service = db.Services.Include(s => s.Operations.Select(o => o.Parameters)).Where(s => s.ServiceID == id).Single();
if (service == null)
{
return HttpNotFound();
}
return View(service);
}
在“服务/编辑”视图中,我使用编辑器模板显示操作的表单。我还将一个空div放在这个表单块之后,稍后通过AJAX.ActionLink为参数填充表单:
@Html.EditorFor(m => Model.Operations)
<div id="parameter_container">
</div>
然后回到我的服务控制器,我有:
public PartialViewResult EditParams(int opID = 0)
{
if (opID == 0)
{
return PartialView();
}
var operation = db.Operations.Include(o => o.Parameters).Where(o => o.OperationID == opID).Single();
if (operation.parameters == null)
{
return PartialView();
}
return PartialView("ParameterEditorRow", operation);
}
ParameterEditorRow是强类型化到我的操作模型的局部视图(这需要在操作后建模。将model.Parameters传递到编辑器模板会生成所需的命名约定(Parameters[i].DataMembers)。这只是:
@model InformationStore.Models.Operation
@{if (this.ViewContext.FormContext == null)
{
this.ViewContext.FormContext = new FormContext();
}
}
<div class="editor_row">
@Html.EditorFor(m => Model.Parameters)
</div>
并张贴至:
[HttpPost]
public ActionResult Edit(Service service)
{
if(ModelState.IsValid)
{
//update db
}
return View(service)
}
我使用IE网络捕获来查看被发回的内容,但它只是在出现故障时显示挂起,然后锁定。我必须承认,我不经常使用它,所以这可能是我的问题
模型类(遗漏了特定于类的成员):
公共类服务
{
[关键]
public int ServiceID{get;set;}
公共虚拟列表操作{get;set;}
}
公营课运作
{
[关键]
公共int操作ID{get;set;}
[必需]
public int ServiceID{get;set;}
[必需]
公共虚拟服务服务{get;set;}
公共虚拟ICollection参数{get;set;}
}
公共类参数
{
[关键]
公共int参数id{get;set;}
[必需]
公共int操作ID{get;set;}
[必需]
公共虚拟操作{get;set;}
}
您正在呼叫:
@Html.EditorFor(m => Model.Parameters)
…这导致发布的参数遵循约定参数[i].DataMembers
。但是从长远来看,您绑定到的模型不是单个的操作
:它是整个服务
,它有一个操作
属性,每个操作都有一个参数
属性。因此,您希望发布的参数看起来更像操作[i]。参数[i] .DataMembers
为此,您需要在调用编辑器时指定htmlFieldName:
@Html.EditorFor(m => Model.Parameters, null, "Operations[0].Parameters")
当然,上面这一行只适用于第0个操作:您将需要动态创建字符串以传入您正在为其创建编辑器的操作的索引。这可能需要额外的欺骗才能获得原始AJAX链接以首先将索引传递给控制器,但您应该能够o找出答案。“当我查看modelstate时,我的所有服务数据成员和操作数据成员都在那里,但我的所有参数数据成员都丢失了。”--这听起来像是一个模型绑定问题。请提供您发布到的操作的代码,以及您尝试绑定的任何模型类。同时提供您在离开浏览器时看到的发布参数(通过Firebug或开发工具),并确定这些参数中的哪些是“参数数据成员”正在丢失。很抱歉造成混淆。通过“参数数据成员”我指的是我的参数类的数据成员。先生,你是个救命恩人。我从@ViewData.TemplateInfo.htmlfiedprefix解析出索引,输入你给我的字符串,现在添加到屏幕上的参数字段被绑定到相应的服务上。谢谢你的帮助。@Jones先生:没问题。保存一些数据总是很好的在几分钟的指导下,进行长达数小时的头部撞击。:-)
public class Service
{
[Key]
public int ServiceID {get; set;}
public virtual List<Operation> Operations {get; set;}
}
public class Operation
{
[Key]
public int OperationID { get; set; }
[Required]
public int ServiceID { get; set; }
[Required]
public virtual Service Service { get; set; }
public virtual ICollection<Parameter> Parameters { get; set; }
}
public class Parameter
{
[Key]
public int ParameterID { get; set; }
[Required]
public int OperationID { get; set; }
[Required]
public virtual Operation Operation { get; set; }
}
@Html.EditorFor(m => Model.Parameters)
@Html.EditorFor(m => Model.Parameters, null, "Operations[0].Parameters")