从列表视图页面传递选定对象的MVC

本文关键字:对象 MVC 列表 视图 | 更新日期: 2023-09-27 18:04:49

我有一个小搜索框,从数据库返回结果。这很好。结果显示在列表页面中,并正确显示。然而,我需要选择对象并将其传递给我的控制器。我得到NULL值,当我调试它,和一个空的结果页。模型如下:

public class CodeSnip
{
    public short Id { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
    public string Code { get; set; }
    public LangType Language { get; set; }
    public string Creator { get; set; }
}
public class ListOfCodeSnips : List<CodeSnip>
{
    public CodeSnip CodeSnip { get; set; }
}
public enum LangType
{
    CSharp,                
    css,
    HTML,
    JavaScript,
    Perl,
    PHP,
    Python,
    Ruby,
    SQL,
    VB,
    XML,
    Other
}

这是控制器方法(它什么也不做):

    [HttpPost]
    public ActionResult Display(CodeSnip snip)
    {
        return View(snip);
    }

这是我的视图。同样,它只发布对象值的null:

@model Models.ListOfCodeSnips
<table class="table">
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.CodeSnip.Title)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.CodeSnip.Description)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.CodeSnip.Language)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.CodeSnip.Creator)
        </th>
    </tr>
    @using (Html.BeginForm("Display", "Home", FormMethod.Post))
    {

    foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.Title)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Description)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Language)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Description)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Creator)
        </td>
        <td>
            <input type="submit" value ="Display"/>
        </td>
    </tr>
        }
    }
</table>

所以,简而言之,我想做的是从视图中获取选定的model-item并将其传递给控制器的Display方法,但正如我所说,我得到的都是null。我已经环顾四周,我发现的都是如何传递对象列表的例子。我试着摆弄那些东西,但是什么也没得到。

感谢您的宝贵时间。

从列表视图页面传递选定对象的MVC

既然你说你已经尝试过ActionLink,它没有工作,这里是它如何工作。而不是传递您正在寻找的类型作为显示操作的参数,传递记录的ID

所以它看起来像这样:

控制器动作

[HttpGet]
public ActionResult Display(int id)
{
    var snip = db/* connection string */.TableName.Find(id);
    return View(snip);
}

ActionLink

@Html.ActionLink("Display", "Display", "ControllerName", new { id = item.Id }, null )
// Or if you want a button that acts as a link, and not just a plain link
<input type="button" class="btn" value="Display" onclick="location.href='@Url.Action("Display", "ControllerName", new { id = item.Id })'" />

让我知道这是否有帮助!

你的代码有两个问题:

1)您不呈现任何将所选值发送回控制器的<input>元素。除Html.DisplayFor外,还可使用Html.HiddenForHtml.EditorFor

2)为了使MVC模型绑定器能够绑定你的列表,使用for循环而不是foreach

参见MVC表单提交未将更新后的模型传递给List

的action方法
for (var i = 0; i < Model.Count(); i++) {
    <tr>
        <td>
            @Html.DisplayFor(m => m[i].Title)
            @Html.HiddenFor(m => m[i].Title)
        </td>
        @* etc ... *@
   <tr>
}

PS:此循环将发布所有显示的CodeSnips,即接收动作将具有签名public ActionResult Display(ListOfCodeSnips postData)