Как отобразить частичное представление по имени на главной странице - PullRequest
1 голос
/ 16 января 2011

Я пытаюсь реализовать что-то вроде Ruby on Rail ActionDispatch::Flash для передачи сообщений на запрос следующей страницы.Подход, который я хочу использовать, состоит в том, чтобы сохранить пару (частичное имя вида, объект модели) в контексте сеанса и отобразить ее на главной странице при обработке запроса на отображение флэш-сообщения.

Внутри моегоHttpApplication подкласс У меня теперь есть:

public class Global : System.Web.HttpApplication
{
    public class FlashStuff
    {
        private string flashViewName;
        private object model;

        public FlashStuff(string flashViewName, object model)
        {
            this.flashViewName = flashViewName;
            this.model = model;
        }

        public string FlashViewName
        {
            get { return flashViewName; }
        }

        public object Model
        {
            get { return model; }
        }
    }

    internal static void Flash(string flashViewName, object model)
    {
        HttpContext.Current.Session.Add("flash", new FlashStuff(flashViewName, model));
    }

    //...
 }

У меня также есть BookmarkController с действием для добавления закладки:

[HandleError]
public class BookmarkController : Controller
{
    public ActionResult Add()
    {
        return View();
    }

    [HttpPost]
    public ActionResult Add(Bookmark_AddModel model)
    {
        if (ModelState.IsValid)
        {
            //...

            Global.Flash("BookmarkAddedFlash", model);
            return RedirectToAction("Index", "Bookmark");
        }

        //...
    }

    //...
}

На моей главной странице я хочу что-то вроде:

        <% var session = HttpContext.Current.Session;
           if (session["flash"] != null)
           {
               var flashStuff = (MyApp.Web.Global.FlashStuff)session["flash"]; %>
               <div><!-- render in here --></div>
        <%     session.Remove("flash");
           } %>

для отображения частичного представления, которое было указано по имени при вызове Global # Flash.

Я хочу использовать представление для флэш-сообщения вместо сохранения сообщения в видеstring в контексте сеанса, потому что я хочу включить в сообщение URL-адрес:

<%-- BookmarkAddedFlash.ascx --%>
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MyApp.Web.Models.Bookmark_AddModel>" %>
<%: Html.DisplayTextFor(m => m.Url) %> was successfully bookmarked.

И я хочу отображать представление только при выполнении следующего запроса;т. е. один запрос устанавливает флэш-сообщение, а последующий запрос отображает его.

Как мне это сделать?

Ответы [ 2 ]

1 голос
/ 17 января 2011

Я не уверен, что полностью понимаю. Недавно я реализовал инфраструктуру 'рычания', в которой я использовал проект asp.net mvc. Это звучит похоже в некоторых отношениях. Вот ссылка на эту реализацию:

http://blog.bobcravens.com/2010/08/making-the-web-growl-using-jquery/

Надеюсь, это поможет.

Bob

1 голос
/ 17 января 2011

Эквивалент объекта RoR Flash в ASP.NET MVC называется TempData.

public ActionResult Action1()
{
    TempData["message"] = "some message";
    return RedirectToAction("action2");
}

public ActionResult Action2()
{
    var message = TempData["message"] as string;
    return View();
}

или используйте его непосредственно в представлении Action2:

<div><%: TempData["message"] %></div>

Внутренне TempData использует объект Session для хранения данных, но он автоматически становится недействительным после одного перенаправления. То, что вы пытаетесь реализовать, уже существует.

...