【问题标题】:ASP.NET MVC using Ajax.ActionLink to make changes in databaseASP.NET MVC 使用 Ajax.ActionLink 对数据库进行更改
【发布时间】:2014-08-01 08:14:42
【问题描述】:

我一直在寻找有关如何在 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 后我并没有更接近解决方案。 我能做错什么吗?

【问题讨论】:

  • 请展示您的完整视图
  • 查看时间过长,无法发表评论,已编辑问题。
  • 我很早就发现了该帖子,但对我并没有太大帮助。我不能使用 UpdateTargetId 参数(可能是不同的剃须刀版本?),我不确定是否应该使用它。但是我的 MarkAsRead 方法至少是正确的吗?是否可以为此返回 void?
  • 使用 ajax 选项并定义 POST 方法

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


【解决方案1】:

您可以在这里做的是,尝试使用消息的 ID。

你应该知道在MVC中路由定义为Controller/Action/id

因此,如果您将消息的 ID 传递给操作,那么您可以更改数据库中的消息状态。 例如:

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 })

在上面的调用中,我返回了一个局部视图,并在 ID 为“update-div-ID”的 Div 中显示了该视图。你需要像这样照顾 AjaxOptions。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多