2013-12-15 3 views
3

Я новичок в MVC и извиняюсь за этот вопрос для новичков. Я следующие классы моделей:Как передать сложные коллекции объектов контроллеру в mvc

public class ReturnBookHedModel 
{ 

    public int RefferenceID { get; set; } 
    public int BorrowedRefNo { get; set; } 
    public int MemberId { get; set; } 
    public DateTime ReturnDate { get; set; } 
    public bool IsNeedToPayFine { get; set; }  
    public DateTime CurrentDate { get; set; } 

    public virtual List<ReturnBookDetModel> RetunBooks { get; set; } 
    public virtual MemberModel member { get; set; } 
} 

public class ReturnBookDetModel 
{ 

    public int BookID { get; set; } 
    public int RefferenceID { get; set; } 
    public bool IsReturned { get; set; } 
    public virtual ReturnBookHedModel ReturnBookHed { get; set; } 
    public virtual BookModel book { get; set; } 
} 

Я следующие методы контроллера:

public ActionResult SaveReturnBook(int refNo) 
    { 
     ReturnBookHedModel model = ReturnBookFacade.GetReturnBookBasedOnRefference(refNo); 
     return View(model); 
    } 

    // 
    // POST: /ReturnBook/Create 

    [HttpPost] 
    public ActionResult SaveReturnBook(ReturnBookHedModel model) 
    { 
     try 
     { 
      // TODO: Add insert logic here 

      return RedirectToAction("Index"); 
     } 
     catch 
     { 
      return View(); 
     } 
    } 

в моей модели я определяют следующим образом:

 <div class="control-label"> 
      @Html.LabelFor(model => model.BorrowedRefNo) 
      @Html.TextBoxFor(model => model.BorrowedRefNo, new { @class = "form-control" ,@readonly = "readonly" }) 
      @Html.ValidationMessageFor(model => model.BorrowedRefNo) 

    </div> 
     // rest of the header details are here 
    <table> 
     <tr>         
      <th> 
       @Html.DisplayNameFor(model => model.RetunBooks.FirstOrDefault().IsReturned) 
      </th> 
      <th> 
       @Html.DisplayNameFor(model => model.RetunBooks.FirstOrDefault().BookID) 
      </th> 
       <th> 
       @Html.DisplayNameFor(model => model.RetunBooks.FirstOrDefault().book.BookName) 
       </th> 
       <th></th> 
      </tr> 

      @foreach (var item in Model.RetunBooks) 
      { 
       <tr >           
        <td> 
         @Html.CheckBoxFor(modelItem => item.IsReturned) 
        </td> 
        <td> 
         @Html.HiddenFor(modelItem => item.BookID); 
         @Html.DisplayFor(modelItem => item.BookID) 
        </td> 
        <td> 
         @Html.DisplayFor(modelItem => item.book.BookName) 
        </td> 
        </tr> 
       } 
</table> 

это работает нормально .. но эти таблицы детали (сложные объекты) не находятся в методе почты контроллера. когда я искал, я обнаружил, что могу использовать эти подробные данные следующим образом: но я не могу использовать его следующим образом.

@for (var i = 0; i < Model.RetunBooks.Count; i++) 
    { 
     <tr>           
      <td> 
       @Html.CheckBoxFor(x => x.RetunBooks.) 
      </td>           
     </tr> 
    } 

, как я могу отправить эти данные в контроллер

+0

Не получить то, что вы просите .. – user1956570

ответ

4

Для того, чтобы коллекция быть вывешены назад вам нужно индексировать их следующим образом для модели связующего, чтобы забрать их.

Это должно сделать трюк:

@for (var i = 0; i < Model.RetunBooks.Count; i++) 
{ 
     ... 
     @Html.CheckBoxFor(model => Model.RetunBooks[i].IsReturned) 
     ... 
} 

Сложные объекты требуют индексации в указанном выше порядке.

Для получения дополнительной информации об этом см здесь:

http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx/

+1

работает как шарм .... спасибо ...... – DevT

Смежные вопросы