获取'在执行当前Web请求期间生成了未处理的异常。'我的MVC UserManagementController出错

时间:2017-09-05 08:24:20

标签: javascript c# jquery asp.net-mvc asp.net-mvc-5

当我执行项目并尝试访问网页AccountSettings时,收到错误消息

  

在执行当前Web请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来识别有关异常的起源和位置的信息。

以下是UserManagementController

的代码
public class UserManagementController : Controller
{
    private UserDatabaseEntities db = new UserDatabaseEntities();

    public ActionResult AccountSettings(int? id)
    {
        if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }
        Login login = db.Logins.Find(id);
        if (login == null)
        {
            return HttpNotFound();
        }
        return View(login);
    }

    public ActionResult AccountSettings([Bind(Include = "UserID,Password")] Login login)
    {
        if (ModelState.IsValid)
        {
            db.Entry(login).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(login);
    }
}

除了编辑和帐户设置之外,每个其他页面运行正常,它们执行类似的功能,但是当我设置用户组时,只有管理员才能访问编辑作为主要用户创建页面,而AccountSettings将是个人用户命令他们在后端更改密码。

以下是我在尝试运行页面时收到的错误消息

  

[AmbiguousMatchException:控制器类型'UserManagementController'上的当前动作'AccountSettings'请求在以下操作方法之间不明确:       System.Web.Mvc.ActionResult类型WebSpares3.Views.UserManagementController上的AccountSettings(System.Nullable`1 [System.Int32])       System.Web.Mvc.ActionResult类型WebSpares3.Views.UserManagementController上的AccountSettings(WebSpares3.Models.Login)

1 个答案:

答案 0 :(得分:0)

此消息非常简单:

  

当前对控制器类型的“AccountSettings”操作请求   'UserManagementController'在以下操作之间不明确   方法

默认情况下,控制器操作方法使用HttpGet,在这种情况下,AccountSettings操作方法定义不明确,因为存在两个具有相同名称和相同HTTP方法的方法。因此,第二个AccountSettings控制器需要HttpPostAttribute来消除请求的歧义:

[HttpPost]
public ActionResult AccountSettings([Bind(Include = "UserID,Password")] Login login)
{
   if (ModelState.IsValid)
   {
       // save changes & redirect
   }
   return View(login);
}

请注意,在不提供AccountSettings参数的情况下直接访问id GET方法时,它将通过此​​块返回HTTP 400:

if (id == null)
{
    return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}

建议改为返回视图:

public ActionResult AccountSettings(int? id)
{
    if (id == null)
    {
        return View();
    }

    // other logic
}

注意:使用强类型的viewmodel优先于BindAttribute,因此您可以轻松控制POST方法:

<强>模型

public class Login
{
    [Required]
    public string UserID { get; set; }

    [Required]
    public string Password { get; set; }
}

<强>控制器

[HttpPost]
public ActionResult AccountSettings(Login login)
{
    if (ModelState.IsValid)
    {
        // save changes & redirect
    }
    return View(login);
}

查看

@model Login

@Html.TextBoxFor(m => m.UserID)
@Html.ValidationMessageFor(m => m.UserID)
@Html.TextBoxFor(m => m.Password)
@Html.ValidationMessageFor(m => m.Password)

<input type="submit" value="Login" />