Могу ли я иметь более одного «Подробности» ActionResult в контроллере? - PullRequest
1 голос
/ 07 октября 2009

У меня есть контроллер с именем TicketsController.vb, с результатом действия:

'
' GET: /Tickets/Details/5
Public Function Details(ByVal id As Integer) As ActionResult
    ViewData("OpenTixCount") = ticketRepository.countOpenTickets.Count()
    ViewData("UrgentTixCount") = ticketRepository.countUrgentTickets.Count()
    ViewData("HighTixCount") = ticketRepository.countHighTickets.Count()
    ViewData("NormalTixCount") = ticketRepository.countNormalTickets.Count()
    ViewData("LowTixCount") = ticketRepository.countLowTickets.Count()

    Dim ticket As hdCall = ticketRepository.GetTicket(id)

    If ticket Is Nothing Then
        Return View("NotFound")
    Else
        ViewData("MyTicketID") = ticket.CallID
        ViewData("UserThatLogged") = ticket.hdUser.RealName
        ViewData("CustomerName") = ticket.hdCustomer.CustomerName
        ViewData("TimeLogged") = ticket.loggedOn.ToLongDateString & " " & ticket.loggedOn.ToLongTimeString
        ViewData("CustomerID") = ticket.CustomerID
        ViewData("CustomerEmail") = ticket.hdCustomer.Email

        Dim custID As Integer = ticket.CustomerID
        Dim TicketsForCustomer = ticketRepository.GetTicketsForThisCustomer(custID).Count()

        ViewData("TicketsForCustomerCount") = TicketsForCustomer
        Dim dataContext As New CustomerServicesDataContext
        ViewData("TicketStatus") = New SelectList(dataContext.hdStatus, "StatusID", "Status", ticket.StatusID)
        ViewData("TicketType") = New SelectList(dataContext.hdCategories, "CategoryID", "Title", ticket.CategoryID)
        ViewData("TicketPriority") = New SelectList(dataContext.hdPriorities, "PriorityID", "Priority", ticket.PriorityID)
        ViewData("CompanyType") = New SelectList(dataContext.hdCompanies, "CompanyID", "Company", ticket.CompanyID)
        ViewData("CallDetails") = ticket.CallDetails

    End If

    Return View(ticket)
End Function

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

'
'GET: /Tickets/Customer/1
Public Function Customer(ByVal custID As Integer) As ActionResult
    ViewData("OpenTixCount") = ticketRepository.countOpenTickets.Count()
    ViewData("UrgentTixCount") = ticketRepository.countUrgentTickets.Count()
    ViewData("HighTixCount") = ticketRepository.countHighTickets.Count()
    ViewData("NormalTixCount") = ticketRepository.countNormalTickets.Count()
    ViewData("LowTixCount") = ticketRepository.countLowTickets.Count()

    Dim cust As hdCustomer = customerRepository.GetCustomerDetails(custID)

    Dim tickets = ticketRepository.FindAllTicketsForThisCustomer(custID)

    ViewData("CustomerName") = cust.CustomerName
    ViewData("CustomerEmail") = cust.Email
    Dim TicketsForCustomer = ticketRepository.GetTicketsForThisCustomer(custID).Count()

    ViewData("TicketsForCustomerCount") = TicketsForCustomer

    Return View(tickets)
End Function

Однако, когда я, например, открываю страницу / Tickets / Customers / 1 , я получаю сообщение об ошибке:

Словарь параметров содержит пустая запись для параметра 'custID' из необнуляемый тип 'System.Int32' для метод 'System.Web.Mvc.ActionResult Клиент (Int32) 'в 'CustomerServicesHelpdesk.TicketsController. Чтобы сделать параметр необязательным, его тип должен быть либо ссылочным типом, либо Обнуляемый тип. Имя параметра: Параметры

Я не совсем уверен, где я иду не так, но может ли это быть, потому что у меня есть 2 ActionResults, ищущих похожие маршруты?

Спасибо за любую помощь заранее.

Ответы [ 2 ]

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

Эта проблема возникает потому, что маршрут по умолчанию в ASP.NET MVC ожидает, что параметр будет иметь имя id, но ваш метод Customer принимает параметр с именем custID.

Быстрое решение проблемы - переименовать custID в id.

Альтернативное решение - добавить собственный маршрут в Global.asax. Как то так

routes.MapRoute(
    "Tickets",                                                  // Route name
    "Tickets/Customers/{custID}",                               // URL with parameters
    new { controller = "Home", action = "Index", custID = "" }  // Parameter defaults
    );
1 голос
/ 07 октября 2009

Не могли бы вы опубликовать определение вашего маршрута? Если вы используете определения маршрутизации по умолчанию, попробуйте переименовать custID в id в определении метода, чтобы он стал:

Public Function Customer(ByVal id As Integer) As ActionResult
...