我一直在寻找有关如何在MVC项目中使用AJAX的信息,到目前为止它只是让我感到困惑。我相信我现在并不太远,无法实现导致数据库条目发生变化的Ajax ActionLink,因此这种变化会反映到视图中。但显然,这段代码现在是错误的:
public void MarkAsRead(Models.MessageModel message)
{
using (var db = new MessengerDBEntities())
{
var dbMessage = db.Messages.FirstOrDefault(m => m.messageID == message.Id);
// Error handling
if (dbMessage == null)
{
ViewBag.ResultMessage =
"Something bad has happened with that message in the meantime. Please log out and in again.";
return;
}
dbMessage.messageRead = true;
db.SaveChanges();
return;
}
}
这是Razor代码:
@if (Model.Count() > 0)
{
<br /><br />
string messageClass;
foreach (var message in Model)
{
messageClass = message.Read ? "message-header" : "message-unread-header";
<div class="message-container">
<div class="@messageClass">
@if (!message.Read)
{
<text>New </text>
}
From: @message.Sender
@if(!message.Read)
{
<span class="mark-read-span">
@Ajax.ActionLink("Mark as read", "MarkAsRead", message, new AjaxOptions())
</span>
}
</div>
<div class="message-mainbody">
@message.Content
</div>
<div class="message-footer">
At: @message.Timestamp.ToShortDateString() @message.Timestamp.ToShortTimeString()
</div>
</div>
<br />
}
}
else
{
<div id="no-messages-div">You haven't got any messages yet. :(</div>
}
在视图中,我正在迭代一组对象(已接收的消息)。对于每条消息,我检查它是否已被读取,如果不是,则会有一个链接将其倾斜到读取状态。我还为div分配了一个不同的类,它根据是否是新消息显示消息:
@messageClass = message.Read ? "message-header" : "message-unread-header";
<div class="message-container">
<div class="@messageClass">
...
我怀疑我使用带有错误的AjaxOptions参数的Ajax.ActionLink助手,但是在阅读MSDN之后我没有接近解决方案。 我有什么办法呢?
答案 0 :(得分:0)
您可以在这里做的是,尝试使用消息的ID。
您应该知道在MVC路由中定义为Controller / Action / id
因此,如果将消息的ID传递给Action,则可以更改数据库中的消息状态。 例如:
public ActionResult Message(long messageid)
{
// do you stuff to the message here in the database
// then return view or partial view whatever you want
return View();
}
Ajax.ActionLink函数的正确语法称之为:
@Ajax.ActionLink("You Link Name", "ActionName", "ControllerName", new { ID = @Message.ID }, new AjaxOptions { HttpMethod = "POST", UpdateTargetId = "update-div-ID", InsertionMode = InsertionMode.Replace })
在上面的调用中,我返回了一个局部视图,并在Div中显示了ID&#34; update-div-ID&#34;。你需要照顾这样的AjaxOptions。