«Словарь параметров содержит пустую запись для параметра» - Как это исправить? - PullRequest
37 голосов
/ 23 марта 2010

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

Код ниже:

public ViewResult Edit(int productId) {
       // Do something here 
}

но я получаю эту ошибку:

"The parameters dictionary contains a null entry for parameter 'productId' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ViewResult Edit(Int32)' in 'WebUI.Controllers.AdminController'. To make a parameter optional its type should be either a reference type or a Nullable type.
Parameter name: parameters"

Я изменил свой маршрут в Global.asax.cs так:

 routes.MapRoute(
"Admin",
"Admin/{action}/{ productId}",
new { controller = "Admin", action = "Edit",  productId= "" }
);

но все равно я получаю сообщение об ошибке.

Ответы [ 7 ]

44 голосов
/ 23 марта 2010

Эта пустая строка для productId (в вашем маршруте по умолчанию) будет проанализирована платформой с нулевой записью, а поскольку int не позволяет null ... вы получаете ошибку.

Измените:

public ViewResult Edit(int productId)

на

public ViewResult Edit(int? productId)

, если вы хотите, чтобы вызывающая сторона не передавала идентификатор продукта, как это выглядитвы хотите сделать это в зависимости от того, как настроен ваш маршрут.

Вы также можете перенастроить свой маршрут по умолчанию, чтобы он передавался по некоторым известным значениям по умолчанию, если не указан идентификатор продукта:

routes.MapRoute( 
    "Admin", 
    "Admin/{action}/{ productId}", 
    new { controller = "Admin", action = "Edit",  productId= -1 } 
14 голосов
/ 06 февраля 2014

Я столкнулся с той же проблемой, следуя работающему примеру SportStore в Pro ASP.Net

Решение было на самом деле, что мое представление индекса имеет следующий код.

@Html.ActionLink("Edit", "Edit", new { id=item.ProductID }) |

Однако мой метод Edit в моем контроллере был определен как

public ViewResult Edit(int productId)

изменение моего представления индекса на

@Html.ActionLink("Edit", "Edit", new { productId=item.ProductID }) |

исправил проблему

6 голосов
/ 27 февраля 2013

Вот способ игнорировать такие ошибки аргумента для любого вызова метода контроллера:

public class MyControllerBase
{
   //...

   protected override void OnActionExecuted(ActionExecutedContext filterContext)
   {
       if (filterContext.Exception != null)
       {
           var targetSite = filterContext.Exception.TargetSite;
           if (targetSite.DeclaringType != null)
               if (targetSite.DeclaringType.FullName == typeof(ActionDescriptor).FullName)
                   if (targetSite.Name == "ExtractParameterFromDictionary")  // Note: may be changed in future MVC versions
                   {
                       filterContext.ExceptionHandled = true;
                       filterContext.Result = new HttpStatusCodeResult((int)HttpStatusCode.BadRequest);
                       return;
                   }
           //...
        }
        // ...
    }
}
4 голосов
/ 13 декабря 2011

productId должен быть ограничен типом int.

new {controller="Admin", action="Edit"},
new {productId = @"\d+" }
1 голос
/ 03 февраля 2013

Возможно, вы забыли передать необходимые данные (в данном случае 'productId') в представлении.
Я предполагаю, что вы пытаетесь получить доступ к деталям, щелкнув ссылку на странице индекса, которую я также назвал «View \ Admin \ index.cshtml»

    <td>
        @Html.ActionLink("Edit", "Edit", new { productId = item.ProductId }) |
        @Html.ActionLink("Details", "Details", new { productId = item.ProductId }) | //note the productId is filled by item.ProductId
        @Html.ActionLink("Delete", "Delete", new { productId = item.ProductId })
    </td>

Если этого не сделать, все параметры будут нулевыми, что приведет к ошибке.

0 голосов
/ 18 мая 2017

Изменение его на маршруте может повлиять на другие маршруты, которые используют тот же URL. Для простоты и охвата всех баз.

[HttpGet]
public ActionResult ThePage(int id = -1)
{
    if(id == -1)
    {
        return RedirectToAction("Index");
    }

    //Or proceed as normal
}

Это также замечательно, если это ошибка, которую вы получаете при доступе к странице, потому что вам необходимо иметь идентификатор (например ... люди, помещающие URL-адрес в адресную строку, когда они не должны) затем установите для параметра необязательное значение.

РЕДАКТИРОВАТЬ: извините, не так долго, как вопрос

0 голосов
/ 23 марта 2010

стандартный класс "int" (int32) не принимает нулевые значения, и в этом случае он прекратит преобразование пустой строки в int и попытается присвоить ему пустое значение.

Я бы, наверное, взглянул на то, что вы пытаетесь достичь - если вы пытаетесь заставить администратора предоставить productID для редактирования этой записи в базе данных, я бы подумал о том, чтобы поместить это в объект Request или какой-либо другой метод, который даст больше гибкости.

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