大家好! 我是MVC框架的新手,最近我遇到了一个麻烦:
我有一个“EditInfo”控制器+基本逻辑,但我无法理解一件事 -
[HttpGet]
public ActionResult EditPacientInfo(string id)
{
// string username = "test_pacient@gmail.com"; <-- THIS ACTUALLY WORKS
string username = id; // <-- AND THIS NOT + 404-NotFoundError
// Fetch the userprofile
ApplicationUser user = db.Users.FirstOrDefault(u => u.UserName.Equals(username));
// Construct the viewmodel
ApplicationUser model = new ApplicationUser()
{
Email = user.Email,
PacientInfo = user.PacientInfo
};
return View(model);
}
所以,你可以看到我可以使用任何值的启动“用户名”字段,我的逻辑按预期工作,但每次我尝试通过地址栏使用发送值 - 我得到404错误
如果它有助于解决我的问题,则有一个View代码:
@foreach (var user in Model.Pacient)
{
<p>
<strong>@user.Username | @ViewBag.Pacient | @Html.ActionLink("Обновить информацию о пациенте ", "EditPacientInfo", "Doctor",new {id = user.Username}) </strong>
</p>
}
如果你能添加或找到一些真正有用的代码/东西会很棒(非常感谢!)
UDPATE 我在视图中更改了我的ActionLink方法(感谢 T_Roy ),我最终可以将数据发送到地址栏,但我遇到了一个新问题 - 如果我在控制器中启动“用户名”字段 - 我的逻辑工作,也不是我通过地址栏发起的
我是否缺少使控制器操作使用GET参数的重要事项? (这是GET + POST方法):
[HttpGet]
public ActionResult EditPacientInfo(string id)
{
// string username = "test_pacient@gmail.com"; <-- THIS ACTUALLY WORKS
string username = id.ToString();<-- AND THIS NOT + 404-NotFoundError
// Fetch the userprofile
ApplicationUser user = db.Users.FirstOrDefault(u => u.UserName.Equals(username));
// Construct the viewmodel
ApplicationUser model = new ApplicationUser()
{
Email = user.Email,
PacientInfo = user.PacientInfo
};
return View(model);
}
[HttpPost]
public ActionResult EditPacientInfo(ApplicationUser pacient)
{
if (ModelState.IsValid)
{
string username = User.Identity.Name;
// Get the userprofile
ApplicationUser user = db.Users.FirstOrDefault(u => u.UserName.Equals(username));
// Update fields
user.Email = pacient.Email;
user.PacientInfo = pacient.PacientInfo;
db.Entry(user).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index", "Doctor"); // or whatever
}
return View(pacient);
}
答案 0 :(得分:-1)
这是因为@Html.ActionLink
辅助方法的实现不正确。
每MSDN
没有重载接受3个字符串对象,然后是1个对象(在您的情况下,是您的路由值)。
您需要使用ActionLink帮助程序方法的这种重载方法:
public static MvcHtmlString ActionLink(
this HtmlHelper htmlHelper,
string linkText,
string actionName,
string controllerName,
object routeValues,
object htmlAttributes
)
所以在你的情况下:
@Html.ActionLink("Обновить информацию о пациенте ", "EditPacientInfo", "Doctor",new {id = user.Username}, null)
请告诉我这是否有帮助!
答案 1 :(得分:-1)
I should've used a [Route] attribute before GET-method to pass data properly via the address bar
这就是在这种情况下编写代码的方式:
[Route("Doctor/EditPacientInfo/{name}")]
public ActionResult EditPacientInfo(string name)
{
// string username = "test_pacient@gmail.com"; <-- THIS ACTUALLY WORKS
string username = name;
// Fetch the userprofile
ApplicationUser user = db.Users.FirstOrDefault(u => u.UserName.Equals(username));
ViewBag.Email = user.Email;
// Construct the viewmodel
ApplicationUser model = new ApplicationUser()
{
PacientInfo = user.PacientInfo
};
return View(model);
}
@ActionLink与[Route]属性结合使用:
@Html.ActionLink("A link name ", "EditPacientInfo", " Doctor",new {name = user.Username},null)