Asp.net mvc Ajax调用Register操作方法时出现Nerd晚餐错误
我是MVC新手,我正在MS MVC2中实现Nerd晚餐MVC示例应用程序。我在第10步,“支持Ajax的RSVPs接受”。我添加了新的RSVP控制器,并添加了寄存器操作方法,如下所示: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
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>