从列表视图页面传递选定对象的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。我已经环顾四周,我发现的都是如何传递对象列表的例子。我试着摆弄那些东西,但是什么也没得到。
感谢您的宝贵时间。
既然你说你已经尝试过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.HiddenFor
或Html.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)
。