Как выполнить привязку модели и отображение данных одновременно, используя один и тот же model.list? - PullRequest
0 голосов
/ 25 февраля 2012

У меня есть код, подобный этому:

My View

@model MyCode.Models.RemarksModel

foreach (var row in Model.List)
{
    <tr>
    <td align="center"><font class="font_table_content">@row.Id</font></td>
    <td align="center"><font class="font_table_content">@row.Full_Name</font></td>
    <td align="center"><font class="font_table_content">@Html.TextBox("row.Remarks")</font></td>
}

Моя модель

public class RemarksModel
{
    public IList<UserRemarks> List { get; set; }
}

Мой объект UserRemarks

public class UserRemarks
{
    public virtual string Id { get; set; }
    public virtual string Full_Name { get; set; }
    public virtual string Remarks { get; set; }
}

Далее в моем контроллере у меня будет некоторый код, который будет загружать записи в IList из БД через Nhibernate, а затем возвращать представление ссписок внутри модели, что-то вроде этого:

[HttpGet]
public ActionResult RemarksTest()
    {
         RemarksModel model = new RemarksModel();
         model.List = LoadTheList();
         return View(model);
    }

Теперь я хочу спросить, как я могу получить список обратно, то есть вернуть значение примечаний?

[HttpPost]
public ActionResult RemarksTest(RemarksModel model)
    {
         var list = model.list;
         foreach (var remarks in list)
         {
               //do something to save the input data into code.
         }

         return View(model);
    }

Фактический код более сложный, и я читал об этих методах IDictionary для получения значений.Однако их реализация приведет к тому, что вместо этого будут отображаться значения , а не , поскольку код больше не ссылается на model.list.

Любые идеи о том, как я могу отображать, а также получатьданные, использующие тот же «список» внутри моей модели выше?

Ответы [ 3 ]

1 голос
/ 25 февраля 2012

Я думаю, вам нужно изменить свое представление следующим образом:

@model IEnumerable<UserRemarks>

@using(Html.BeginForm())
{
    for(int i=0; i<@Model.Count; i++) 
    {
        <table> 
        <tr> 
            <td align="center"><font class="font_table_content">@Html.TextboxFor(m => m[i].Id)</font></td> 
            <td align="center"><font class="font_table_content">@Html.TextboxFor(m => m[i].Full_Name</font></td> 
            <td align="center"><font class="font_table_content">@Html.TextboxFor(m => m[i].Remarks")</font></td>
        </tr>
        </table>
    }

    <input type="submit" value="submit"/>
}

Тогда действие get должно быть изменено на:

[HttpGet] 
public ActionResult RemarksTest() 
    { 
         List<UserRermarks> model = LoadTheList();
         return View(model);
    }

И действие публикации изменилось на:

[HttpPost] 
public ActionResult RemarksTest(IEnumerable<UserRemarks> model) 
    { 
         foreach (var remarks in model) 
         { 
               //do something to save the input data into code. 
         } 

         return View(model); 
    } 

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

Надеюсь, это работает для вас.

0 голосов
/ 25 февраля 2012

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

Следуйте http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx, чтобы связать список с моделью.

0 голосов
/ 25 февраля 2012

В вашем действии контроллера GET вы можете сохранить список в TempData:

[HttpGet]
public ActionResult RemarksTest()
{
     RemarksModel model = new RemarksModel();
     model.List = LoadTheList();
     TempData['List'] = model.List;
     return View(model);
}

Затем в вашем действии POST получить его с помощью:

var myList = TempData['List']

Если ваше приложение не имеет состояния(т.е. без сессий), тогда вы можете использовать поставщика TempData на основе файлов cookie .

...