给出以下代码
行动方法
// Action for A
public ActionResult New(Ticket t, int knownLocation, string location) { ... }
// Action for B
public ActionResult Edit(Log log, int id, string assignTo, int knownLocation, string location) { ... }
观看次数
// Ticket.ascx
<%= Html.EditorFor(t => t.KnownLocation);
// A
<%@ Inherits="System.Web.Mvc.ViewPage<Models.Ticket>" %>
<%= Html.EditorForModel() %>
// B
<%@ Inherits="System.Web.Mvc.ViewPage<Models.Log>" %>
<%= Html.EditorFor(l => l.Ticket) %>
模型
class Log
{
...
Ticket Ticket { get; set; }
string Message { get; set; }
...
}
class Ticket
{
...
Importance Importance { get; set; }
string Name { get; set; }
// Please note the protected access level
Location KnownLocation { get; protected set; }
string Location { get; protected set; }
...
}
在New(“ A”)中,
knownLocation
可以正常工作。在Edit(“ B”)中,
knownLocation
引发一个异常(在幕后):参数字典包含一个
参数的空条目
非空类型的“ knownLocation”
方法的'System.Int32'
'System.Web.Mvc.ActionResult
编辑(TechHelp.Core.Models.Log,Int32,
System.String,Int32,System.String)'
在
'TechHelp.Mvc.Controllers.TicketsController'。
可选参数必须是
引用类型,可为null的类型,或者为
声明为可选参数。
如何访问该字段?请注意,它不能绑定到模型的属性。
最佳答案
如果查看正在创建的html,则应该看到正在创建的输入的名称在每种情况下都是不同的。
如果您真的想直接从POST中获取结果,则需要确保intknownLocation与第二种情况下创建的输入名称匹配(我怀疑是Ticket_KnownLocation,但我也怀疑您是重新使用MVC 2预览版本,因此您可能会有所不同)。
无论如何,我想说的是您可能不想直接从POST中提取knownLocation。如果Controller需要访问它,我真的建议您将其在Model上公开,并让ModelBinding框架为您完成工作。然后,您可以使用log.Ticket.KnownLocation访问它。