controller post action not able catch list of obje

2019-03-03 17:40发布

It may duplicate question, i have searched all over but couldn't satisfied, so i am posting here question.

I have object as (generated from entity framework),

 public partial class Usp_Sel_NotEnteredStringResources_Result
{

    public string name { get; set; }
    public Nullable<int> Value { get; set; }

    public int StringResourceId { get; set; }
    public Nullable<int> LanguageId { get; set; }
} 

and view i have created as,

@{
    ViewBag.Title = "Resource Entry Languagewise";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>ResourceEntry</h2>

@using (Html.BeginForm("ResourceEntry", "LangResource", FormMethod.Post))
{

   <fieldset>
<table>


 @for (int i = 0; i < Model.ToList().Count; i++)
 {
       <tr>
        <td>@Html.DisplayFor(m => Model.ElementAt(i).name)</td>
        <td>@Html.TextBoxFor(m => Model.ElementAt(i).Value)</td>

           @Html.HiddenFor(m => Model.ElementAt(i).LanguageId)
           @Html.HiddenFor(m => Model.ElementAt(i).name)
           @Html.HiddenFor(m => Model.ElementAt(i).StringResourceId)                 
    </tr> 
 }

</table>
       <p>
            <input type="submit" value="Save" />
        </p>
          </fieldset>
}

And Controller as,

 [HttpPost]
        public ActionResult ResourceEntry(List<Usp_Sel_NotEnteredStringResources_Result> list)
        {
           // here getting the null value for list
            // ??????  
            return View(list);
        }

After submitting the form controller gets null value for list, what is wrong with code??

1条回答
聊天终结者
2楼-- · 2019-03-03 18:03

You cannot use .ElementAt(). If you inspect the html your generating you will see that the name attribute has no relationship to your model.

You model needs to implemet IList<Usp_Sel_NotEnteredStringResources_Result> and use a for loop

@for (int i = 0; i < Model.Count; i++)
{
    <tr>
        <td>@Html.DisplayFor(m => m[i].name)</td>
        <td>
            @Html.TextBoxFor(m => m.[i]Value)
            // note you hidden inputs should be inside a td element
            @Html.HiddenFor(m => m[i].LanguageId)
            ....
        </td>             
    </tr>
}

Alternative if the model is IEnumerable<Usp_Sel_NotEnteredStringResources_Result>, you can use an EditorTemplate (refer [Post an HTML Table to ADO.NET DataTable for more details on how the name attributes must match your model property names, and the use of an EditorTemplate)

查看更多
登录 后发表回答