Внедрить что-нибудь в ASP MVC Result - PullRequest
1 голос
/ 22 ноября 2011

В моем проекте мне нужно добавить функциональность, которая показывает инфобокс в правом верхнем углу страницы, когда клиент что-то сохраняет. Все отлично работает, когда операция сохранения перенаправить на другую страницу в моем решении.

Действие запуска клиента при сохранении:

[SaveAction] //my own action filter to show info box
public ActionResult Details(int id, FormCollection form)
{
    var pojazd = PojazdRepo.GetById(id);;
    if (UpdateAndSave(pojazd, form))
    {
        return RedirectToAction("Index");
    }
    else
    {
        return View(GetDetailsViewModel(id, true));
    }
}

Теперь мой тест фильтра действий, что ModelState.IsValid истинно, затем добавьте что-то в TempData:

public class SaveActionAttribute : ActionFilterAttribute
{
    private bool test;
    private bool isAjax;

    public override void OnActionExecuted(ActionExecutedContext ctx)
    {
        test = ctx.Controller.ViewData.ModelState.IsValid;
        isAjax = ctx.HttpContext.Request.IsAjaxRequest();
        base.OnActionExecuted(ctx);
    }

    public override void OnResultExecuting(ResultExecutingContext ctx)
    {

        if (test)
        {
            if (isAjax) ctx.Controller.TempData["ActionPopUp"] = "";
            else ctx.Controller.TempData["ActionPopUp"] = "save";
        }   
        base.OnResultExecuting(ctx);
    }
}

И мой Site.Master запускает скрипт, если TempData["ActionPopUp"] = "save":

<script type="text/javascript">
    $(document).ready(function () {
        var test = '<%: TempData["ActionPopUp"] %>';
        if (test != '') SaveSuccessPopUp(test);
    });
</script>

Как уже упоминалось, это решение работает нормально, когда контроллер делает Redirect и Site.Master загружается снова, моя проблема в том, как вставить функцию SaveSuccessPopUp () в результат действия, когда Action вызывается AJAX и что-то возвращать перезагрузите страницу и не запускайте Site.Master $(document).ready кодовый блок.

1 Ответ

0 голосов
/ 22 ноября 2011

Хороший вопрос.

Вам, вероятно, нужно работать с частичным представлением здесь.Я имею в виду, что если ваш запрос является ajax-запросом, добавьте TempData снова, и TempData будет выведен в частичном представлении .

Как вы отправите вывод этого частичного представления в виде фрагмента html?

У меня есть запись в блоге о том, как вы можете отправить частичное представление в виде строки.Тема другая, но вы поймете:

http://www.tugberkugurlu.com/archive/working-with-jquery-ajax-api-on-asp-net-mvc-3-0-power-of-json-jquery-and-asp-net-mvc-partial-views

Вот пример:

    [HttpPost]
    public ActionResult toogleIsDone(int itemId) {

        //Getting the item according to itemId param
        var model = _entities.ToDoTBs.FirstOrDefault(x => x.ToDoItemID == itemId);
        //toggling the IsDone property
        model.IsDone = !model.IsDone;

        //Making the change on the db and saving
        ObjectStateEntry osmEntry = _entities.ObjectStateManager.GetObjectStateEntry(model);
        osmEntry.ChangeState(EntityState.Modified);
        _entities.SaveChanges();

        var updatedModel = _entities.ToDoTBs;

        //returning the new template as json result
        return Json(new { data = this.RenderPartialViewToString("_ToDoDBListPartial", updatedModel) });
    }

RenderPartialViewToString - расширение контроллера.Вы можете найти полный код для этого по ссылке ниже:

https://bitbucket.org/tugberk/tugberkug.mvc/src/6cc3d3d64721/TugberkUg.MVC/Helpers/ControllerExtensions.cs

После того, как ваш html вернется в код на стороне клиента, добавьте его в DOM и работайте над ним.Анимируй, покажи / скрой, делай с ней все, что тебе нужно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...