Подтвердить что ты не робот

"Словарь параметров содержит нулевую запись для параметра" - Как исправить?

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

Код ниже:

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= "" }
);

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

4b9b3361

Ответ 1

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

Изменить:

public ViewResult Edit(int productId)

к

public ViewResult Edit(int? productId)

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

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

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

Ответ 2

Я столкнулся с одной и той же проблемой, следуя заработанным примером 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 }) |

исправлена ​​проблема

Ответ 3

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

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

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

new {controller="Admin", action="Edit"},
new {productId = @"\d+" }

Ответ 5

Возможно, вы забыли передать необходимые данные (в данном случае "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>

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

Ответ 6

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

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

Ответ 7

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

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

    //Or proceed as normal
}

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

ИЗМЕНИТЬ: извините int, не так долго, как задал вопрос