На asp.net MVC 3 с использованием бритвенного двигателя, какова лучшая практика для передачи данных между несколькими представлениями? - PullRequest
0 голосов
/ 19 февраля 2011

прежде всего, извините за мой английский

Я новичок в ASP.NET MVC и пытался разработать простое веб-приложение с использованием Razor Engine

поэтому у меня есть это представление с именем Extract, которое принимает URL-адрес в качестве ввода:

@using (Html.BeginForm("Begin", "Rss"))
{
@Html.LabelFor(m => m.Url) @Html.TextBoxFor(m => m.Url)
<button>Extrair</button>
}

при отправке, это отправит URL моего контроллера:

public ActionResult Begin(ExtractModel m)
        {
            if (ModelState.IsValid)
            {
                var extractedData = ExtractorService.Extract(m.Url);
                if (extractedData != null)
                {
                    TempData["extractedData"] = extractedData;
                    return RedirectToAction("Extracted", extractedData);
                }
            }
            return View();
        }

тогда новое представление с именем Extracted покажет все ссылки, извлеченные из переданного rss:

public ActionResult Extracted(ExtractedModel m)
        {
            if (TempData["extractedData"] != null)
            {
                ViewData["extractedData"] = TempData["extractedData"];
                return View(ViewData["extractedData"] as ExtractedModel);
            }
            else
            {
                return RedirectToAction("Extract");
            }
        }

-

@using (Html.BeginForm())
{
    foreach (var data in Model.Data)
    {
<ul>
    <li><a href="@data.Link">@data.Link</a></li>
</ul>
    }
<button>Converter</button>
}

Суть в том, что я хочу спросить: как мне получить ViewData ["extractData"], который я установил при загрузке этого представления, чтобы я мог передать его обратно в контроллер и проанализировать всю информацию внутри него ? потому что, когда я нажимаю кнопку «Конвертер», мои ViewData пусты и я ничего не могу обработать без них = \

1 Ответ

1 голос
/ 19 февраля 2011

Я бы не использовал TempData для передачи сложных объектов между представлениями.Я бы тоже избавился от ViewData.

Тогда я бы предпочел, чтобы действие контроллера отображало выборку любой необходимой информации:

public class RssController: Controller
{
    public ActionResult Extract()
    {
        var model = new ExtractModel();
        return View(model);
    }

    [HttpPost]
    public ActionResult Begin(string url)
    {
        if (ModelState.IsValid)
        {
            return RedirectToAction("Extracted", new { url = url });
        }
        return View();
    }
}

имеет соответствующее представление, позволяющее ввести URL (~/Views/Rss/Extract.cshtml):

@model AppName.Models.ExtractModel
@using (Html.BeginForm("Begin", "Rss"))
{
    @Html.LabelFor(m => m.Url) 
    @Html.TextBoxFor(m => m.Url)
    <input type="submit" value="Extrair" />
}

, а в другом действии вы перенаправляете на:

public ActionResult Extracted(string url)
{
    var extractedData = ExtractorService.Extract(url);
    if (extractedData != null)
    {
        return View(extractedData);
    }
    return RedirectToAction("Extract");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...