给出以下代码

行动方法

// 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访问它。

08-03 21:50