Как получить доступ к полям в View с другим типом ASP.NET MVC - PullRequest
2 голосов
/ 14 октября 2009

С учетом следующего кода

Методы действий

// 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 работает нормально. В режиме «Правка» («B») knownLocation создает исключение (за кадром):

Словарь параметров содержит пустая запись для параметра 'knownLocation' не обнуляемого типа 'System.Int32' для метода «System.Web.Mvc.ActionResult Изменить (TechHelp.Core.Models.Log, Int32, System.String, Int32, System.String) ' в 'TechHelp.Mvc.Controllers.TicketsController. Необязательный параметр должен быть ссылочный тип, обнуляемый тип или объявлен как необязательный параметр.

Как я могу получить доступ к этому полю? Обратите внимание, что он не может привязываться к свойству модели.

1 Ответ

2 голосов
/ 14 октября 2009

Если вы посмотрите на создаваемый html, вы должны увидеть, что имя создаваемого ввода отличается в каждом случае.

Если вы действительно хотите получить результат прямо из POST, вам нужно убедиться, что ваш int knownLocation соответствует имени входного файла, который создается во втором случае (я подозреваю, что это Ticket_KnownLocation, но я также подозреваю, что вы используете предварительную сборку MVC 2, поэтому она может отличаться для вас).

Несмотря на это, я бы сказал, что вы, вероятно, не не хотите вытаскивать известное местоположение прямо из POST. Если Контроллеру нужен доступ к нему, я бы действительно посоветовал сделать его открытым для Model и позволить инфраструктуре ModelBinding сделать вашу работу за вас. Затем вы получаете к нему доступ с помощью log.Ticket.KnownLocation.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...