Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc Ajax调用Register操作方法时出现Nerd晚餐错误_Asp.net Mvc_Asp.net Ajax - Fatal编程技术网

Asp.net mvc Ajax调用Register操作方法时出现Nerd晚餐错误

Asp.net mvc Ajax调用Register操作方法时出现Nerd晚餐错误,asp.net-mvc,asp.net-ajax,Asp.net Mvc,Asp.net Ajax,我是MVC新手,我正在MS MVC2中实现Nerd晚餐MVC示例应用程序。我在第10步,“支持Ajax的RSVPs接受”。我添加了新的RSVP控制器,并添加了寄存器操作方法,如下所示: public class RSVPController : Controller { DinnerRepository dinnerRepository = new DinnerRepository(); // // AJAX: /Dinners/RSVPForEvent/1

我是MVC新手,我正在MS MVC2中实现Nerd晚餐MVC示例应用程序。我在第10步,“支持Ajax的RSVPs接受”。我添加了新的RSVP控制器,并添加了寄存器操作方法,如下所示:

public class RSVPController : Controller
{
    DinnerRepository dinnerRepository = new DinnerRepository();

    //
    // AJAX: /Dinners/RSVPForEvent/1

    [Authorize, AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Register(int id) {

        Dinner dinner = dinnerRepository.GetDinner(id);

        if (!dinner.IsUserRegistered(User.Identity.Name)) {

            RSVP rsvp = new RSVP();
            rsvp.AttendeeName = User.Identity.Name;

            dinner.RSVPs.Add(rsvp);
            dinnerRepository.Save();
        }

        return Content("Thanks - we'll see you there!");
    }
}
我添加了对两个Ajax脚本库的引用,并将下面的代码添加到详细信息视图中,如本文所述:

<div id="rsvpmsg">

<% if(Request.IsAuthenticated) { %>

    <% if(Model.IsUserRegistered(Context.User.Identity.Name)) { %>       

        <p>You are registred for this event!</p>

    <% } else { %>  

        <%= Ajax.ActionLink( "RSVP for this event",
                             "Register", "RSVP",
                             new { id=Model.DinnerID }, 
                             new AjaxOptions { UpdateTargetId="rsvpmsg"}) %>         
    <% } %>

<% } else { %>

    <a href="/Account/Logon">Logon</a> to RSVP for this event.

<% } %>

</div>
当我进入代码时,它正在正确地查找Register操作方法。在使用它之后,我从Register方法的约束中删除了“AcceptVerbs(HttpVerbs.Post)”,然后它就工作了。但是它没有重新加载页面,只是在一个新的空白页面上显示了“谢谢-我们在那里见”的消息。查看详细信息页面中的html,没有表单提交,所以我想知道Ajax代码是否需要更多的东西才能使调用成为帖子?书呆子晚餐应用程序的这一部分是否存在已知问题?我认为这个应用程序是用MVC1编写的,而我使用的是MVC2——这有区别吗

蒂亚


Ciaran

您的这部分操作解释了为什么您会收到“再见”的消息:

这就是所有被归还的东西

您获得404的原因是使用了actionlink:

 Ajax.ActionLink(...
这将创建一个URL链接,一个GET而不是POST,并且
AcceptVerbs(HttpVerbs.POST)
将强制不匹配。您应该提交一份表格来发布:

using (Ajax.BeginForm("Controller", "Action", new AjaxOptions { UpdateTargetId = "f1" } )) { %>
 <div id="f1">
 <!-- form fields here -->
 <input type="submit" />
 </div>
<% } %>
使用(Ajax.BeginForm(“Controller”,“Action”,新的AjaxOptions{UpdateTargetId=“f1”})){%>

要使用
Ajax.ActionLink
制作http post,您必须执行例如
新的AjaxOptions{UpdateTargetId=“rsvpmsg”,HttpMethod=“post”}

为了以防万一,我在使用MVC 3时遇到了问题,这是因为我链接到了MS AJAX库,MVC 3在默认情况下实际上使用了jQuery,所以我只需要取消母版页中的链接注释就可以了。

如果在
站点.master中包含这两个链接,应该可以了

<script src="/Scripts/MicrosoftAjax.js" type="text/javascript"></script>
<script src="/Scripts/MicrosoftMvcAjax.js" type="text/javascript"></script> 

作为一名Java/JSF开发人员,作为对该问题调试问题的补充说明,我遇到了一个艰难的教训:

<script src="/Scripts/MicrosoftAjax.js" type="text/javascript" />



处理方式不同。第一个完全不工作,第二个工作正常。

这是MVC3中使用的Details.cshtml。使用GET和not POST重定向的问题类似

<div id="rsvpmsg">
    @if (Request.IsAuthenticated)
    {
        if (Model.IsUserRegistered(Context.User.Identity.Name))
        {
        <p>
            You are registered for this event</p>
        }
        else
        {
        @Ajax.ActionLink("RSVP for this event",
        "Register",
        "RSVP",
        new { id = Model.DinnerID },
        new AjaxOptions { UpdateTargetId = "rsvpmsg", HttpMethod = "Post" })
        }
    }
    else
    {
        <p>
            <a href="/Account/Logon">Logon</a> to RSVP for this event.</p>
    }
</div>
@section JavaScript
{
    <script src="@Url.Content("~/Scripts/MicrosoftAjax.js")" type="text/javascript"></script>;
    <script src="@Url.Content("~/Scripts/MicrosoftMvcAjax.js")" type="text/javascript"></script>;
}

@如果(请求已验证)
{
if(Model.IsUserRegistered(Context.User.Identity.Name))
{

您已注册参加此活动

} 其他的 { @ActionLink(“此事件的RSVP”, “注册”, “RSVP”, 新的{id=Model.DinnerID}, 新的AjaxOptions{UpdateTargetId=“rsvpmsg”,HttpMethod=“Post”}) } } 其他的 { 此事件的RSVP

} @节JavaScript { ; ; }
好的,我之前提到过我也有同样的问题,这是因为MVC3使用了不引人注目的JavaScript

要实现这一点,您有两种解决方案,一种是在webconfig文件中禁用不引人注目的Javascript:

  <appSettings>
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
  </appSettings> 

第二个解决方案更符合我的喜好,也同样简单。您只需在标题中包含额外的javascript源文件:

<head>
    <title>@ViewBag.Title</title>
    <link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" />
    <script src="@Url.Content("~/Scripts/jquery-1.4.4.min.js")" type="text/javascript"></script>
    <script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")" type="text/javascript"></script>
    @RenderSection("JavaScript",required:false)
</head>

@视图包。标题
@RenderSection(“JavaScript”,必需:false)
生成的javascript不引人注目,结果为HTML:

<a onclick="Sys.Mvc.AsyncHyperlink.handleClick(this, new Sys.UI.DomEvent(event), 
{ insertionMode: Sys.Mvc.InsertionMode.replace, httpMethod: 'Post', updateTargetId: 'rsvpmsg' });" href="/RSVP/Register/13">RSVP for this event</a>
本次活动的RSVP

在这两种情况下,生成的功能是相同的,第二种解决方案是“更符合新MVC 3的精神”。

PDF教程(相对于联机HTML版本)具有排版ANSI引号字符(0x94)而不是ASCII(0x22)在脚本元素的HTML块中。下面显示了正确的块,并替换了所有引号字符

<script src="/Scripts/MicrosoftAjax.js" type="text/javascript"></script>
<script src="/Scripts/MicrosoftMvcAjax.js" type="text/javascript"></script>

Visual Studio将在JavaScript源文件上标记警告绿色的波形(“未找到文件”),但不标记类型属性,这样您可能会注意到问题并仅更正源文件。但是,
type
属性的格式仍然不正确,这将导致无法在浏览器中正确加载脚本


使用Chrome developer工具,我注意到这些脚本没有作为详细信息HTML页面的资源列出。更正
类型
属性的引号字符,允许注册操作按照教程中的说明工作,没有任何更改。

我在处理这个示例时尝试转换为MVC3/Razor.我已经在这个完全相同的问题上纠缠了至少24个小时了…完全相同的症状。我在这页上尝试了我能理解或认为相关的一切

在我的web.config中没有提到不引人注目的javascript,我正在考虑添加“false”值,认为“true”可能是默认值。但是,我认为它可能会把其他事情搞砸(谁知道还有什么)

我在wrox论坛上发现了以下tid。如果我将以下代码行添加到我的RSVPStatus.cshtml部分视图的第二行:

<script src="/Scripts/jquery.unobtrusive-ajax.min.js" type="text/javascript"></script>

我知道Zak提到了上面的那行代码(以及其他一些引导我走向正确方向的东西),但我使用的是局部视图,自从我开始使用MVC以来,我还没有看到一个头部标签。我知道它可能在某个地方,但现在MS编程的所有烟雾和镜子,使它更难剖析,我可能会在某个时候走上Zak的道路。所以,对他来说,+1


无论如何,希望这有助于节省一天的时间。

Hi Tahbaza,返回的文本应该会更新详细信息页面中的一个div-UpdateTargetId=“rsvpmsg”。根据Scott Gu教程中“注册”链接下方的代码和屏幕截图
<head>
    <title>@ViewBag.Title</title>
    <link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" />
    <script src="@Url.Content("~/Scripts/jquery-1.4.4.min.js")" type="text/javascript"></script>
    <script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")" type="text/javascript"></script>
    @RenderSection("JavaScript",required:false)
</head>
<script src="/Scripts/MicrosoftAjax.js" type="text/javascript"></script>
<script src="/Scripts/MicrosoftMvcAjax.js" type="text/javascript"></script>
<script src="/Scripts/jquery.unobtrusive-ajax.min.js" type="text/javascript"></script>