ASP.NET MVC使用Ajax.ActionLink在数据库中进行更改

时间:2014-06-11 10:03:12

标签: asp.net ajax asp.net-mvc asp.net-mvc-4

我一直在寻找有关如何在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之后我没有接近解决方案。 我有什么办法呢?

1 个答案:

答案 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。