1

画面に削除ハイパーリンクが表示されています:

UsersPartial VIEW:

<%: 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値を割り当てるまではnullになるため、ビューでその値を確認してから表示することができます。

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

同じビューを返す後続の呼び出しでは、表示したくない場合は単にに設定ViewBag.Statusします。null

于 2012-09-19T15:45:41.817 に答える
2

コントローラアクションから2つの異なる部分ビューを返すことはできません。使用する可能性のあるアプローチの1つは、最初のパーシャルを文字列にレンダリングしてから、コントローラーアクションに2つのプロパティを持つJSON結果を返すようにすることです。1つはHTMLパーシャルを含み、もう1つは表示するメッセージを含みます。

[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 に答える