我刚创建的ActionMethod无法找到

时间:2016-08-07 17:12:07

标签: asp.net-mvc routing

所以我创建了一个表来保存所有经过身份验证的用户的额外信息。此表还链接到我的数据库中的许多其他人。虽然有多个字段与成员资格表(电子邮件和用户名)共享相同的信息,但此表通过用户ID连接到asp.net身份。不幸的是,有一个错误从我添加的用户表中删除了一些此成员资格数据,而不是身份表本身。错误本身已被修复,但我正在尝试创建一种从成员资格表中检索此丢失信息的方法。我这样做的方法是在用户的编辑屏幕上添加一个按钮(不是usersadmin页面,而是我添加的users表)。我带按钮的按钮代码如下所示: 按钮动作
Button to action

UserReset Action代码如下所示: UserReset操作代码
UserReset Action Code

我目前遇到的麻烦实际上是能够调用此操作(或者甚至此时打开编辑页面)。每当我尝试加载页面时,它都会抛出一个在控制器中找不到的公共操作方法"错误。我觉得这是我最后的一个新手错误,但有人可以告诉我我做错了吗?

1 个答案:

答案 0 :(得分:0)

我要紧紧抓住背景故事,然后回答这个问题:

所以,你发现了两件大事。第一个是CSHTML(但不是您当前特定错误的直接原因)。请参阅下面的CSHTML建议(特别是如果在C#Action修复后遇到更多问题)

首先,你的控制器。如果您查看UserReset操作,则会注意到您使用[HttpPost]进行了装饰。正如您所说,您无法打开编辑页面。这是因为编辑页面操作不存在(例如,请求的URL处的[HttpGet]操作)。这就是你需要的:

public class TSTUsersController : IController 
{
    ...
    //You need this action to process the get request
    [HttpGet]
    public ActionResult UserReset()
    {
        return View("UserReset"); //return the edit form html to the user
    }
    //this method will handle the button click
    [HttpPost]
    public ActionResult UserReset( String email )
    {
        if(ModelState.IsValid)
        {
            //save the information to the database
            //direct the user to some sort of confirmation page 
            return RedirectToAction("Index", "Home");
        }
        //return the form with the error messages
        return View("UserReset", email);
    }
    ...
}

据我所知,您完全误解了HTML表单提交。

<form></form>元素有两个缺少的主要参数:

<form 
    method="POST"
    action="@Url.Action("UserReset", 'TSTUsers")" //e.g. POST /TSTUsers/UserReset
    ... >
    ...
    <button>Submit</button>
</form>

或者,使用帮助者:

@using( Html.BeginForm( "UserReset", "TSTUsers", FormMethod.Post ) )
{
     <button>Submit</button>
}

现在,这将发布到指定的操作。要添加参数,在您的情况下,您使用不变的参数(例如,用户无法输入电子邮件),因此您有两个选项。您可以修改action参数来指定参数(请注意,如果对您不重要,用户会在非ajax帖子上看到此Url),如下所示:

<form 
    action="@Url.Action("UserReset", 'TSTUsers", new { email = Model.Email })" 
        //e.g. POST /TSTUsers/UserReset?email=example@example.com
    ... >
    ...
    <button>Submit</button>
</form>

或者,使用帮助者:

@using( Html.BeginForm( "UserReset", "TSTUsers", FormMethod.Post, new { email = Model.Email } ) )
{
    <button>Submit</button>
}

现在,如果您希望隐藏请求中的Url参数(无论出于何种原因),那么您应该添加inputtype hidden:< / p>

<form 
    action="@Url.Action("UserReset", 'TSTUsers")" //e.g. "POST /TSTUsers/UserReset
    ... >
    <input type="hidden" name="email" value="@Model.Email"
    <button>Submit</button>
</form>

或者,使用帮助者:

 @using( Html.BeginForm( "UserReset", "TSTUsers", FormMethod.Post ) )
 {
    @Html.Hidden("email", Model.Email )
    <button>Submit</button>
 }