저는 회사의 서비스 용 데이터베이스 입력 시스템을 사용하고 있습니다. 각 서비스는 필요한만큼의 작업을 수행 할 수 있습니다. 마찬가지로 각 작업에는 필요한만큼의 매개 변수가있을 수 있습니다. 내가 뭘 하려는지 동적 양식을 사용하여 내 서비스/편집보기 내에서 작업 매개 변수에 대한 데이터를 업데이트합니다.MVC3- AJAX를 사용하여 동적 양식 데이터를 서버에 게시
서비스에 작업을 추가하는 데 동적 양식을 사용했지만 서비스보기에서 게시하는 대신 작동/생성에서 게시했습니다. 이것은 문제가되어서는 안되지만, 나는 지적했다.
이제는 매개 변수 양식의 데이터를 서버에 다시 게시하는 문제가 있습니다. ModelState.isValid가 false로 돌아옵니다. 내 modelstate를 보면 서비스 데이터 멤버와 운영 데이터 멤버가 모두 있지만 모든 매개 변수 데이터 멤버가 손실됩니다. FormCollection을 사용하여 내 동적 양식의 이름을 확인했으며 모델 바인딩 (Parameters [i] .DataMembers)에 대한 MVC의 명명 규칙을 실제로 따르고 있습니다.
누군가 나를 위해 통찰력을 제공 할 수 있습니다. 내 서비스 컨트롤러 내에서
: 내 서비스/편집보기 내
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);
}
내가 작업을위한 양식을 표시 할 편집기 템플릿을 사용하여 여기에 도움이 될 수있는 몇 가지 코드가있다. 내가 나중에 AJAX.ActionLink을 통해 매개 변수의 형태로 채워진 형태의 블록 후에 빈 사업부를 배치 : 내 편집기 템플릿 내에서 다음
@Html.EditorFor(m => Model.Operations)
<div id="parameter_container">
</div>
, 내가 설정 내 AJAX.ActionLink :
@Ajax.ActionLink("Edit Parameters", "EditParams", "Services", new { opID = Model.OperationID, ViewContext.FormContext.FormId },
new AjaxOptions
{
UpdateTargetId = "parameter_container",
InsertionMode = InsertionMode.Replace,
HttpMethod = "Post"
})
다시 내 서비스 컨트롤러에서 다음
난이 :
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 강하게 내 운영 모델에 입력되는 부분보기 (이 O를 모델로 할 필요가있다 peration. 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>
그런 다음 마지막으로, 내 매개 변수 편집기 템플릿을 가지고있다. 나는 긴 게시물에 대해 사과하지만 나는 지금 며칠 동안이 일에 매달 렸습니다. 나는 근본적으로 내 접근 방식에 문제가있는 것처럼 느껴진다. 어떤 제안? 응답
이
편집 내 편집보기에서
, 내 입력 필드의 모든이 양식 내에있는 StriplingWarrior하기 :
[HttpPost]
public ActionResult Edit(Service service)
{
if(ModelState.IsValid)
{
//update db
}
return View(service)
}
:
@using (Html.BeginForm("edit", "services", new {Model.ServiceID}, FormMethod.Post))
하고있는가에 게시되고 IE 네트워크 캡처를 사용하여 게시 된 내용을 확인했지만 중단 될 때 보류 중이라고 말한 다음 잠글 수 있습니다. 나는 그것을 아주 자주 사용하지 않는다는 것을 인정해야한다. 그래서 그것은 내 문제 일 수있다.
모델 클래스 (왼쪽으로 클래스의 특정 멤버) :
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; }
}
"내 modelstate를 보면 모든 서비스 데이터 멤버와 운영 데이터 멤버가 있지만 모든 매개 변수 데이터 멤버는 손실됩니다." - 이것은 모델 바인딩 문제처럼 들립니다. 게시하려고하는 작업의 코드와 바인딩하려는 모든 모델 클래스를 제공해 주시겠습니까? 또한 Firebug 또는 dev 도구를 통해 브라우저에서 나가는 POST 매개 변수를 제공하고 이러한 매개 변수 중 손실되는 "매개 변수 데이터 구성원"을 식별하십시오. – StriplingWarrior
혼란을 가져 주어서 죄송합니다. "매개 변수 데이터 멤버"는 내 매개 변수 클래스의 데이터 멤버를 의미합니다. –