1

我在屏幕上显示了一个删除超链接:

用户部分视图:

<%: Ajax.ActionLink("Delete", "Delete", new { id = item.UserID }, new AjaxOptions { HttpMethod = "GET", UpdateTargetId = "tabs-users", InsertionMode = InsertionMode.Replace }, htmlAttributes: new { data_target = "#tabs-users" })%>

这在我的控制器中调用了一个方法

控制器

    [HttpGet]
    public PartialViewResult Delete(int id)
    {
        userManager.DeleteUser(id);
        ViewBag.Status = string.Format("User deleted ok, id: {0}", id);
        return PartialView("UsersPartial", userManager.GetUsers());
    }

在上面的代码中,我返回了一个 PartialView,这是可行的。我还想在这个视图的顶部显示一条消息,上面在 ViewBag.Status 中定义,但我只希望它在执行此操作后显示此 div。

另请注意,我要返回的视图是强类型的:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<LMS.Data.User>>" %>

最后,我要显示的状态消息是一个 div,它是我在另一个局部视图中创建的,因此我可以在整个站点中显示它。

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<dynamic>" %>

<div id="status" class="statusok">
<%: ViewBag.Status %>
</div>

这样做的正确方法是什么?

4

2 回答 2

3

ViewBag.Status在您为其分配值之前将为空,因此您可以在视图中对其进行检查然后显示它:

@if(ViewBag.Status != null)
{
    <div id="status" class="statusok">
       @ViewBag.Status
    </div>
}

在返回相同视图的后续调用中,如果您不再希望它显示,只需设置ViewBag.Status为。null

于 2012-09-19T15:45:41.817 回答
2

您不能从控制器操作返回 2 个不同的局部视图。您可能使用的一种方法是将第一个部分呈现为字符串,然后让您的控制器操作返回具有 2 个属性的 JSON 结果 - 一个包含 HTML 部分,另一个包含要显示的消息:

[HttpDelete]
public PartialViewResult Delete(int id)
{
    userManager.DeleteUser(id);
    return Json(new 
    {
        Partial = RenderPartialViewToString("UsersPartial", userManager.GetUsers()),
        StatusMessage = string.Format("User deleted ok, id: {0}", id)
    });
}

接着:

<%= Ajax.ActionLink(
    "Delete", 
    "Delete", 
    new { 
        id = item.UserID 
    }, 
    new AjaxOptions { 
        HttpMethod = "DELETE", 
        OnSuccess = "onDelete"
    }, 
    htmlAttributes: new { data_target = "#tabs-users" }
) %>

然后编写onDelete回调:

function onDelete(result) {
    $('#tabs-users').html(result.Partial);

    // TODO: instead of alerting display the message wherever you want
    // and using whatever plugin you want to make it look pretty
    alert(result.StatusMessage);
}

您还会注意到,我为此任务使用了正确的 HTTP 动词 - DELETE。切勿使用 GET 动词来调用正在修改服务器上的状态的控制器操作(例如删除实体)。

于 2012-09-19T15:45:11.193 回答