当我执行项目并尝试访问网页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)
答案 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" />