1

저는 회사의 서비스 용 데이터베이스 입력 시스템을 사용하고 있습니다. 각 서비스는 필요한만큼의 작업을 수행 할 수 있습니다. 마찬가지로 각 작업에는 필요한만큼의 매개 변수가있을 수 있습니다. 내가 뭘 하려는지 동적 양식을 사용하여 내 서비스/편집보기 내에서 작업 매개 변수에 대한 데이터를 업데이트합니다.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; } 
    } 
+0

"내 modelstate를 보면 모든 서비스 데이터 멤버와 운영 데이터 멤버가 있지만 모든 매개 변수 데이터 멤버는 손실됩니다." - 이것은 모델 바인딩 문제처럼 들립니다. 게시하려고하는 작업의 코드와 바인딩하려는 모든 모델 클래스를 제공해 주시겠습니까? 또한 Firebug 또는 dev 도구를 통해 브라우저에서 나가는 POST 매개 변수를 제공하고 이러한 매개 변수 중 손실되는 "매개 변수 데이터 구성원"을 식별하십시오. – StriplingWarrior

+0

혼란을 가져 주어서 죄송합니다. "매개 변수 데이터 멤버"는 내 매개 변수 클래스의 데이터 멤버를 의미합니다. –

답변

2

당신은 요구하고있다 : 게시 된 매개 변수가 발생

@Html.EditorFor(m => Model.Parameters) 

는 ... 대회 Parameters[i].DataMembers를 따르십시오. 그러나 장기간에 바인딩하는 모델은 개별 Operation이 아니며 전체 Service이며 Operations 속성이 있고 각 작업에는 Parameters 속성이 있습니다. 따라서 게시 된 매개 변수가 Operations[i].Parameters[i].DataMembers과 비슷하게 보이기를 원합니다. 물론

@Html.EditorFor(m => Model.Parameters, null, "Operations[0].Parameters") 

은, 위의 라인은 제로 번째 작업을 위해 작동합니다 : 동적으로 만들어야합니다

이렇게하려면, 당신은 당신이 편집기를 호출하는 htmlFieldName를 지정해야합니다 에디터를 만들고있는 Operation의 인덱스에서 전달할 문자열. 원래 AJAX 링크를 통해 컨트롤러에 처음으로 인덱스를 전달하려면 추가로 finagling이 필요하지만,이를 파악할 수 있어야합니다.

+0

당신은 생명의 은인입니다. @ ViewData.TemplateInfo.HtmlFieldPrefix에서 색인을 파싱하여 나에게 준 문자열에 전달되었으며 이제 화면에 추가 된 매개 변수 필드가 해당 서비스에 바인딩됩니다. 도와 주셔서 감사합니다. –

+1

@MrJones : 문제 없습니다. 수 분간의 수업으로 몇 시간 동안 헤드 뱅잉을하는 것이 좋습니다. :-) – StriplingWarrior