2013-05-14 3 views
3

Это мое первое приложение asp.net mvc. Я использую mvc 3 и бритву для своих просмотров. Конкретный вид, с которым у меня есть проблема является сильно типизированным видом (по крайней мере, я думаю, что это), но она принимает вид этого рода:Сбор данных из строго типизированного вида бритвы

@model List<List<DataAccess.MCS_DocumentFields>[]> 

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

@model List<DataAccess.MCS_DocumentFields>[] 

Все, что мне нужно, чтобы построить свою точку зрения в:

@using (Html.BeginForm("ActionMethodName", "Forms", FormMethod.Post)) 
{ 
    <div id="drawForm"> 
     <table border="1"> 

Внутри Hhtml.BeginForm я построить таблицу со всеми данными, поступающими от контроллера. Now on submit:

<button type="submit">Submit</button> 

Я ищу лучший способ получить свои данные и обновить в базе данных то, что изменилось. В моем контроллере у меня есть этот метод:

[HttpPost] 
     public ActionResult ActionMethodName(FormCollection collection) 
     { 
      var test = collection; 
      List<MCS_Documents> model = DocumentsService.All().ToList(); 
      return View("Index", model); 
     } 

Таким образом, я могу найти мои данные, но это так сложно, я даже не знаю, как я доберусь до него. Я пытался что-то другое, используя тот же метод, но принимая в качестве аргумента типа которого вид принимает:

[HttpPost] 
      public ActionResult ActionMethodName(List<List<DataAccess.MCS_DocumentFields>[]> collection) 
      { 

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

Так что же лучший способ в моем конкретном сценарии , для обработки данных, представленных в форме?

PS

Это, как я сделать мой основной вид:

<table border="1"> 
      <colgroup> 
      <col span="1" style="width: 10%;" /> 
      <col span="1" style="width: 40%;" /> 
      <col span="1" style="width: 25%;" /> 
      <col span="1" style="width: 25%;" /> 
      </colgroup> 
      <tbody> 
       @for (int i = 0; i < Model.Count(); i++) 
       { 
        if (Model[i][0][0].ContentTypeId == 1) 
        { 
         @Html.Partial("_PartialHeader", Model[i]) 
        } 
        else if (Model[i][0][0].ContentTypeId == 2) 
        { 
         @Html.Partial("_PartialDrawing", Model[i]) 
        } 
        else if (Model[i][0][0].ContentTypeId == 3) 
        { 
         @Html.Partial("_PartialBody", Model[i]) 
        } 
        else if (Model[i][0][0].ContentTypeId == 4) 
        { 
         @Html.Partial("_PartialFooter", Model[i]) 
        } 
       } 
      </tbody> 
     </table> 
     <button type="submit">Save</button> 

и это одна из моих обертонов, просто чтобы показать, как я использую их:

@model List<DataAccess.MCS_DocumentFields>[] 
     <tr>   
       @if (!string.IsNullOrEmpty(Model[0][0].FieldValue)) 
       { 
        <td colspan="2"> 
        @Html.DisplayFor(x => x[0][0].FieldValue) 
        </td> 
       } 
       else 
       { 
        <td colspan="2"> 
        Sign in here 
        </td> 
       }   

       @if (!string.IsNullOrEmpty(Model[1][0].FieldValue)) 
       { 
        <td colspan="2"> 
        @Html.DisplayFor(x => x[1][0].FieldValue) 
        </td> 
       } 
       else 
       { 
        <td colspan="2"> 
        Sign in here 
        </td> 
       }   

     </tr> 
+1

Пожалуйста показать, как вы рендеринг данных из вашей модели (где-то должен быть какой-то цикл) – Jan

+0

@Jan См. отредактированное оригинальное сообщение. – Leron

ответ

2

Это последнее метод действия правильный (который принимает ваш сильный тип), но ваши взгляды должны быть структурированы по-разному. Вы должны убедиться, что каждый (даже подкатегории) правильно проиндексированы, иначе привязка модели не удалась.

Ваше мнение должно быть что-то вроде следующего (обратите внимание на использование for петель):

Общий вид:

@model List<List<DataAccess.MCS_DocumentFields>[]> 

@for (int i = 0; i < Model.Count; i++) 
{ 
    @Html.RenderPartial("PartialName", Model[i]) 
} 

Тогда в вашем Partial:

@model List<DataAccess.MCS_DocumentFields>[] 

    @for (int i = 0; i < Model.Count; i++) 
    { 
     //Not sure if you need anything at this level 
     for (int j = 0; j < Model[i].Count(); j++) 
     { 
      //Add your EditorFor's, HiddenFor's etc for the child type 
     } 
    } 
+0

Ничего себе, вы даже не видите мое обновление. Вы можете увидеть код, который я добавил в своем исходном сообщении.Вы правы в том, как я работаю с моделью, но вы можете видеть, что я уже передаю 'Model [i]' в @ Html.Partial и все еще получаю null в моем контроллере. Почему вы думаете, что это произошло? – Leron

+0

@Leron У вас на самом деле нет полей, содержащих данные, которые будут отправлены обратно на сервер? У вас есть только «DisplayFor», который не публикуется. Попробуйте добавить 'HiddenFor' и посмотреть, есть ли разница. – mattytommo

+0

На самом деле у меня 3 поля :) Но теперь нужно уходить. Собираюсь принять ваш ответ и заглянуть в него завтра, а также добавить «HiddenFor», чтобы получить дополнительную информацию. Благодарю. – Leron

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