如何使用相同的model.list同时进行模型绑定和数据显示?

时间:2012-02-25 11:55:34

标签: asp.net-mvc-3 model-binding

我有类似的代码:

我的观点

@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; }
}

我的用户注释对象

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

接下来在我的控制器中,我将有一些代码通过Nhibernate从DB加载记录到IList中,然后返回带有模型内部列表的视图,如下所示:

[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 个答案:

答案 0 :(得分:1)

我认为您需要更改您的观点,如下所示:

@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,所以我无法测试上面的内容,但是逻辑应该是正确的,所以如果出现问题,可能只是因为我输入了一些错误。

希望这适合你。

答案 1 :(得分:0)

在您的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']

如果您的应用是无状态的(即没有会话),那么您可以使用a cookie-based TempData provider

答案 2 :(得分:0)

问题是你只是在显示值。 要将值发布到服务器,您需要输入一些输入(例如,文本框,复选框,单选按钮,隐藏字段)。在您的情况下,您可以定义隐藏字段,以便模型绑定器将它们绑定到UserRemarks列表。

按照http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx将列表绑定到模型。