无法通过地址栏正确发送数据

时间:2017-08-29 19:18:29

标签: c# asp.net-mvc entity-framework asp.net-identity

大家好! 我是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);
    }

2 个答案:

答案 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)