2012-07-10 3 views
0

두 모델 : OuterModel 및 InnerModel. OuterModel과 InnerModel 사이에는 일대 다 관계가 있습니다. 내 질문을 명확히하기 위해 내 모델의 형식은 IEnumerable < OuterModel>입니다. 보기에 임의의 수의 OuterModels을 전달하고 사용자는 각 OuterModel에 대해 임의의 수의 InnerModel을 만듭니다. 그런 다음 제출할 때 InnerModel을 의도 한 OuterModels에 데이터베이스에 추가 할 수 있도록 컨트롤러가 OuterModels 목록을 수신하도록합니다.MVC3-보기에서 컨트롤러로 동적 데이터를 사용하여 전체 모델 전달

MVC의 모델 바인딩을 사용하기에 올바른 명명 규칙이 있다고 생각합니다.

OuterModel[i].InnerModel[j].Property 

내 문제는, 정말 컨트롤러에 전달 OuterModels의 목록을 얻을하는 방법을 알고하지 않습니다 여기에 그 모습입니다.

@model IEnumerable<OuterModel> 

    @using (Html.BeginForm("Create", "Controller", new { OuterModels = Model }, FormMethod.Post)) 
    { 
     //Code to create the InnerModels here 
    } 

을 그리고 여기 내 컨트롤러에 무슨 : 여기 내보기에 시도했습니다 무엇

[HttpPost] 
    public ActionResult Create(IEnumerable<OuterModel> OuterModels, FormCollection fc) 
    { 
     String[] keys = fc.AllKeys; 
     if(ModelState.IsValid){ 
      //Add to db 
     } 
    } 

키 내 모든 속성은 내가 이전에 지정한 명명 규칙을 따르고 있는지 보여줍니다 그러나 ModelState.IsValid는 false를 반환합니다.

InnerModels이 만들어지기 전에 OuterModels = Model을 제출하라는 양식을 말하고 있지만 OuterModels에 데이터가 여전히 존재한다고 생각할 수 있습니다. 오늘은 정말 피곤해서 한 가지 (또는 여러 가지) 작은 세부 사항을 살펴볼 것입니다. 어떤 제안? 컨트롤러에 OuterModels의 목록을 전달

--EDIT--

가장 좋은 방법이 될 수 없습니다. 누구든지 더 좋은 의견이 있으면 공유하십시오.

+0

여기에 innermodels를 만들려면 * 코드를 게시해야합니다. * – VJAI

+0

코드의 특정 부분이 실제 문제와 독립적이므로 내 코드를 게시하는 것을 주저합니다. 내 문제는 모델을 컨트롤러에 전달하는 것이지 InnerModels을 만드는 것이 아닙니다. 이것은 단순한 예일뿐입니다. –

답변

1

색인이 제대로 사용되는 한이 문제가되지 않습니다. 여기에 양식 이름을 구상하는 방법이 나와 있습니다.

모델 [0]

.bar 인

모델 [0] .Inner [0] 모델 [0] .Inner [1]

.bar 인 외측 모델 속성을 갖는 경우

을 .foo 외부 모델에는 내부 객체 컬렉션 인 inner라는 속성이 있습니다. 내부 개체에는 bar라는 속성이 있습니다. 양식이 올바른 색인으로 렌더링되면 모델 바인딩이 작동해야합니다. 양식 필드가 클라이언트 측에서 생성되는 경우 상황이 까다로워 질 수 있습니다. 모델을 조작하기 위해 서버로 돌아가는 것이 좋습니다. 추가 왕복 여행이 있지만 Ajax 요청을 통해 여행을 할 수 있습니다.

다음은 좀 더 자세한 예입니다.여기

public class InnerModel{ 
    public string Name{get; set;} 
} 

public class OuterModel{ 
    public List<InnerModel> InnerModels{get; set;} 
    public string Name{get; set;} 
} 

내가 같을 것이다 내 시야를 구상 할 것입니다 : 이것은 형태로 포장되어있는 경우

@model IEnumerable<OuterModel> 

<ul> 
    @{int i = 0;} 
    @foreach(var item in Model){ 
    <li> 
     Outer Name : @Html.TextBoxFor(m=>Model[i].Name) 
     <br /> 
     @{int j = 0;} 
     <ul> 
      @foreach(var innerItem in Model[i].InnerModels){ 
       <li>Inner Name : @Html.TextBoxFor(m=> Model[i].InnerModels[j].Name)</li> 
       j++; 

      } 
     </ul> 
     i++; 
    </li> 
    } 
</ul> 

--- 및 컨트롤러 액션은 다음과 같습니다

public ActionResult Action(List<OuterModel> model){ 
} 

그러면 모델이 올바르게 채워질 것이라고 생각합니다.

나는 당신의 모양을 알아 챘다. 나에게 보이지 않는다. 나는 OuterModel을 통과하는 것이 효과가있을 것이라고 생각하지 않는다. 솔직히 내가 틀렸지 만. 여기

@using (Html.BeginForm("Create", "Controller", new { OuterModels = Model }, FormMethod.Post)) 
{ 
    //Code to create the InnerModels here 
} 

은 .. 내가 가르치는 클래스 .. 것을 확실히 작동에 대한 한 예입니다

public class Author 
{ 
    public string Name { get; set; } 
} 

public class Book 
{ 
    public string Name { get; set; } 

    public List<Author> Authors { get; set; } 
} 

컨트롤러 :

public class BookController : Controller 
{ 

    public static List<Book> _model = null; 

    public List<Book> Model 
    { 
     get 
     { 
      if (_model == null) 
      { 
       _model = new List<Book> 
       { 
        new Book{ 
         Name = "Go Dog Go", 
         Authors = new List<Author>{ 
          new Author{Name = "Dr. Seuss"} 
         }}, 
        new Book{ 
         Name = "All the Presidents Men", 
         Authors = new List<Author>{ 
          new Author{Name = "Woodward"}, 
          new Author{Name = "Bernstein"} 
         }}, 
        new Book{ 
         Name = "Pro ASP.NET MVC Framework", 
         Authors = new List<Author>{ 
          new Author{Name = "Sanderson"}, 
          new Author{Name = "Stewart"}, 
          new Author {Name = "Freeman"} 
         }} 
       }; 
      } 
      return _model; 
     } 
    } 

    public ActionResult Index() 
    { 
     return View(Model); 
    } 

    public ActionResult Edit() 
    { 
     return View(Model); 
    } 

    [HttpPost] 
    public ActionResult Edit(List<Book> books) 
    { 
     _model = books; 
     return RedirectToAction("Index"); 
     //return View(books); 
    } 

} 

및 전망 :

@model List<AmazonWeb.Models.Book> 
@{ 
    ViewBag.Title = "Index"; 
} 

<div class="content"> 

@Html.ActionLink("Index", "Index") 

@using (Html.BeginForm()) 
{ 
    <input type="submit" value="save" /> 
<ul class="book-list"> 

@for (var i = 0; i < Model.Count; i++) 
{ 
    <li> 
     <label>Book Name</label> : @Html.TextBoxFor(m => Model[i].Name) 
     <ul> 
      @for (var j = 0; j < Model[i].Authors.Count; j++) 
      { 
       <li><label>Author Name</label> : @Html.TextBoxFor(m => Model[i].Authors[j].Name)</li> 
      } 
     </ul> 
    </li> 
} 
</ul> 
    <input type="submit" value="save" /> 
} 
</div> 
+0

인디스 값이 정확하며 양식이 실제로 편집기 필드의 새 행에 대한 부분 뷰를 렌더링하는 AJAX 요청을 통해 생성됩니다. –

+0

나는 내 대답을 편집하려고하는데, 도움이되는지 보자 ... –

+0

도움이되었지만 멀리있는 것은 아닙니다. 명시 적으로 컨트롤러 작업에 대한 매개 변수를 전달하는 대신 null로 남겨 두었습니다. 즉, 새로운 {OuterModel = Model}을 null로 변경했습니다. 이제 내 InnerModel 데이터가 ModelState로 전달되지만 원래 OuterModel 데이터가 표시되지 않습니다. 오늘은 긴 하루였습니다. 나는 내일 이것을 다룰 것이다. –

관련 문제