我正在 ASP.NET MVC 中进行 CRUD,但我的编辑方法不起作用,我已经尝试了几种方法,在我最后一次尝试中,当我单击编辑按钮时出现以下错误。
参数字典包含“AdministraZion.Controllers.ProfilesController”上方法“System.Web.Mvc.ActionResult Update (Int32)”的不可空类型“System.Int32”的参数“idProfile”的 NULL 条目。可选参数必须是引用类型、可空类型或声明为可选参数。参数名称:参数
在这里我留下完整的代码,希望你能帮助我解决我的问题。
这是我的视图模型(ProfileViewModel)
public class PerfilViewModel
{
public int idPerfil { get; set; }
public string descripcion { get; set; }
public int idEstatus { get; set; }
public IEnumerable<SelectListItem> Estatus { get; set; }
}
这是我的控制器(ProfilesController)
public ActionResult Update(int idPerfil)
{
PerfilViewModel vm = new PerfilViewModel();
using (OrganizacionEntities2 db = new OrganizacionEntities2())
{
var t = db.catPerfiles.Find(idPerfil);
vm.descripcion = t.descripcion;
vm.idEstatus = (int)t.idEstatus;
vm.idPerfil = t.idPerfil;
}
ViewBag.Estatus = db.catEstatus.Select(x => new SelectListItem
{
Text = x.descripcion,
Value = x.idEstatus.ToString()
}).ToList();
return View(vm);
}
[HttpPost]
public ActionResult Update(PerfilViewModel vm)
{
try
{
if (ModelState.IsValid)
{
using (OrganizacionEntities2 db = new OrganizacionEntities2())
{
var t = db.catPerfiles.Find(vm.idPerfil);
t.descripcion = vm.descripcion;
t.idEstatus = vm.idEstatus;
db.Entry(t).State = System.Data.Entity.EntityState.Modified;
db.SaveChanges();
ViewBag.successMessage = "Estatus agregado con exito";
}
return Redirect("/Perfiles/");
}
ViewBag.Estatus = db.catEstatus.Select(x => new SelectListItem
{
Text = x.descripcion,
Value = x.idEstatus.ToString()
}).ToList();
return View(vm);
}
catch (Exception ex)
{
ViewBag.successMessage = "Ocurrio un error, reintente por favor";
throw new Exception(ex.Message);
}
}
这是我的观点(更新)
@model AdministraZion.ViewModels.PerfilViewModel
@using (Html.BeginForm("Update", "Perfiles", FormMethod.Post))
{
@Html.HiddenFor(d => d.idPerfil)
<div class="box-body">
<div class="form-group">
<label for="inputDescripcion" class="form-control-label mt-3 ml-5">Descripción:</label>
@Html.TextBoxFor(m => m.descripcion, "", new { @class = "form-control ml-5", style = "width:92%" })
</div>
<div class="form-group">
<label for="inputEstatus" class="form-control-label ml-5">Estatus:</label>
@Html.DropDownListFor(m => m.idEstatus, new SelectList(ViewBag.Estatus, "Value", "Text"), "--- Selecciona ---", new { @class = "form-control ml-5", style = "width:92%" })
</div>
</div>
<div class="box-footer" style="text-align:center">
<button type="submit" class="btn block btn-success mb-3" style="width: 30%" name="crear">Crear <i class="fa fa-plus-circle"></i></button>
</div>
}
MyRoute.Config _
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Login", action = "Index", id = UrlParameter.Optional }
);
}
}
源代码错误:
在执行当前 Web 请求期间引发了未处理的异常。可以使用以下异常堆栈跟踪来识别有关异常来源和位置的信息。
这是堆栈跟踪:
[ArgumentException:参数字典包含“AdministraZion.Controllers.ControllerProfiles”上方法“System.Web.Mvc.ActionResult Update(Int32)”的不可为空类型“System.Int32”的参数“profileid”的 NULL 条目。可选参数必须是引用类型、可为空的类型,或者必须声明为可选参数。参数名称:parameters] System.Web.Mvc.ActionDescriptor.ExtractParameterFromDictionary(ParameterInfo parameterInfo, IDictionary2 parameters, MethodInfo methodInfo) +527 System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary2 parameters) +91 System.Web.Mvc . ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext,
在您的控制器中,替换:
经过:
原因在 route.config 中:
如果您想要另一种选择,您可以在控制器操作上使用 [Route] 属性,如下所示:
推荐阅读:https ://devblogs.microsoft.com/aspnet/attribute-routing-in-asp-net-mvc-5/