ASP.NET MVC ActionResult POST 不提交

Posted

技术标签:

【中文标题】ASP.NET MVC ActionResult POST 不提交【英文标题】:ASP.NET MVC ActionResult POST without Submit 【发布时间】:2016-02-14 10:02:54 【问题描述】:

所以我是一个非常新的 ASP.NET MVC,几个月前我介绍了 ASP.NET,不幸的是几乎忘记了所有内容:(

我的任务是向页面添加一个查找按钮,该按钮从文本框中接收用户名并验证该用户名是否有效。

我花了好几个小时试图让它工作。不幸的是,我真正需要做的是坐下来几个星期,重新自学并学习 javascript、jquery、asp.net mvc。我将学习这一切,但这个任务很小而且很具体,需要花费数周时间学习语言和框架才能开始解决问题。

这是我现在的位置:

控制器结构:

public class NewUserRequestController : Controller

    // GET: NewUserRequest
    public ActionResult Index()
    
        return View(new NewUserRequest());
    

    [HttpPost]
    [ValidateAntiForgeryToken()]
    public ActionResult LookupLDN(ITFormsLibrary.NewUserRequest req)
    
        //Code that Verifies user etc
        return View(req);
    

    [HttpPost]
    [ValidateAntiForgeryToken()]
    public ActionResult Submit(ITFormsLibrary.NewUserRequest req)
    
            //Code that handles submission validation & errorvalidation 
            return View("Index", req);
    

现在在视图中,我尝试过搞砸:

@using((Ajax.BeginForm("LookupLDN", "NewUserRequest", FormMethod.Post, new AjaxOptions  UpdateTargetId = "NewUserIfo", new  @class = "form-inline", role = "form" ))

只是发现我不能嵌套表单。

我试过了:

@Ajax.ActionLink("Lookup", "LookupLDN", "NewUserRequest", new  Model,null, new  @class = "form-inline", role = "form" )

@html.ActionLink("Lookup", "LookupLDN", "NewUserRequest", new  Model)

由于某种原因,两者都返回 404。

我也试过了:

<input type="button" value="Lookup" onclick="return lookupLDN()"/>

但是,我不知道如何构造一个 javascript 语句来处理异步 POST? - 我应该尝试发布吗?

如果你们中的任何人了解我想要完成的工作并能提供帮助,我将不胜感激。谢谢!

【问题讨论】:

您可以为此使用 [Remote] 属性 - 请参阅 How to: Implement Remote Validation in ASP.NET MVC @StephenMuecke - [Remote] 属性必须是 .NET 中最不为人知但功能最强大的数据验证标签之一。 【参考方案1】:

JSON 怎么样。

已编辑 根据汤米的评论。使用 POST 而不是 GET。

它应该是一个 POST 方法,因为您正在向服务器发送数据 并要求它对该数据采取行动(POST),而不仅仅是询问 服务器在不发送任何内容的情况下向我们提供信息(GET)。 使用 POST,您可以围绕 CSRF 令牌添加检查,不必担心 关于 Googlebot 做了不该做的事情,等等。

HTML(视图)

 <input type="button" id="btnLookupUser" value="Lookup" />

JAVASCRIPT

$(document).ready(function () 
 $('#btnLookupUser').click(function () 
        var vUsername= $('#txtUserName').val();

        if (vUsername.trim() == '') 
            return;
        
        else
        
       //URL to your JSON method. (here I suppose you have a LookupUser action method. Change application path the way it works for you.)
         $.ajax(
        url: applicationPath + '/LookupUser',
        type: 'POST',
        dataType: 'json',
        data:  userName: encodeURIComponent(vUsername.trim()), 
        cache: false,
        success: function (result) 

           //Do your logic based on the result.
            switch (result) 
            case true:

                break;
            default:
                break;

            
        ,
         error: function (xhr, ajaxOptions, thrownError) 
         alert(xhr.status);
         alert(thrownError);
    )

    );
);

控制器

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult LookupUser(string userName)
 
    //Your logic
    return Json("Whether is valid or not"); //You can as well deny GET   here.

【讨论】:

我想我忘了在原始帖子中说清楚我试图将完整模型从视图传递到控制器,以便我可以验证控制器中的用户名,设置用户名到 NewUserRequest 对象,然后将该对象返回给视图。那里的 JSON 只是处理传递给控制器​​的用户名本身? @user3653277 - 为什么需要整个模型来验证用户名?该解决方案(除了强制您使用 GET 之外,可以而且应该重写以使用 POST)无需任何额外信息即可准确完成所需内容。如果名称有效,则它已在表单(文本框)中设置。如果不是,我假设您会在某处设置valid=false 标志以防止完整的表单提交并突出显示文本框红色。注意 - 您应该在完整形式的 POST 上再次检查用户名,因为 JS 验证很容易绕过。 感谢您的意见,Tommy。我就是这么想的。当我建议使用 GET 而不是 POST 时,我相信这必须是 GET,因为他只是验证用户名而不发布任何内容。如果我错了,请纠正我。 @Moe - 也不是真的“必须”。但是,我强调它应该是一个 POST 方法,因为您正在向服务器发送数据并要求它对该数据采取行动(POST),而不仅仅是要求服务器向我们提供信息而不发送任何信息(GET)。使用 POST,您可以围绕 CSRF 令牌添加检查,不必担心 Googlebot 会做它不应该做的事情等。只是一个与个人喜好相关的约定问题 :)(你不必;不必记得添加 AllowGet) 汤米!非常感谢您解释这一点!我真的很感激。

以上是关于ASP.NET MVC ActionResult POST 不提交的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC 控制器方法必须返回 ActionResult 吗?

Asp.net MVC 中Controller返回值类型ActionResult

如何在 ASP.NET MVC 控制器中更改返回的 ContentType (ActionResult)

ASP.NET MVC ActionResult POST 不提交

从 ASP.NET MVC 5 中的控制器 ActionResult 更改 html 元素样式

覆盖方法 asp.net mvc