How can I do model binding and data display at the same time using the same model.list?

≯℡__Kan透↙ 提交于 2019-12-22 01:28:19

问题


I have a code similar to this:

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

My Model

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

My UserRemarks Object

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

Next in my controller, I will have some code that will load the records into a IList from the DB via Nhibernate, and then return the view with the list inside the model, something like this:

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

Now, what I want to ask is, how am I able to receive the list back, i.e. get the remarks value back?

[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);
    }

The actual code is more complex, and I've read about those IDictionary methods to receive the values. However implementing them, will cause the values not to be displayed instead, since the code no longer refers to the model.list.

Any ideas how can I display, and yet also, receive the data using the same 'list' inside my model above?


回答1:


I think you need change your view as follows:

@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"/>
}

Then the get action should be changed to:

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

And the post action changed to:

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

         return View(model); 
    } 

Unfortunately I don't have visual studio on the computer I am working on so I am unable to test the above but the logic should be correct so if a problem occurs it may just be that I have typed something slightly a miss.

Hope this works for you.




回答2:


In your GET controller action you could store the list in TempData:

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

Then in your POST action retrieve it with:

var myList = TempData['List']

If your app is stateless (i.e. no sessions), then you can use a cookie-based TempData provider.




回答3:


The problem is you are just displaying the values. To post values to server back, you need to have some inputs (like, textbox,checkbox,radiobutton,hiddenfields). In your case you can define hidden fields ,so that model binder will bind them to List of UserRemarks.

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



来源:https://stackoverflow.com/questions/9443758/how-can-i-do-model-binding-and-data-display-at-the-same-time-using-the-same-mode

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!