【问题标题】:on asp.net mvc 3 using the razor engine, what's the best practice to pass data between multiple views?在使用 razor 引擎的 asp.net mvc 3 上,在多个视图之间传递数据的最佳做法是什么?
【发布时间】:2011-02-19 23:41:57
【问题描述】:

首先,对不起我的英语

我是 ASP.NET MVC 的新手,正在尝试使用 Razor 引擎开发一个简单的 Web 应用程序

所以我有一个名为 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["extractedData"] 以便我可以将其传递回控制器并解析其中的所有信息? 因为当我点击按钮转换器时,我的 ViewData 是空的,没有它我无法处理任何东西 =\

【问题讨论】:

    标签: c# asp.net-mvc-3 razor


    【解决方案1】:

    我不会使用 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();
        }
    }
    

    具有允许输入网址的相应视图(~/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");
    }
    

    【讨论】:

    • 我想我明白了你的意思,我在视图之间传递了不必要的数据,对吧?现在我只是想知道,因为“提取”视图获取了 url,提取了 rss 信息并将解析后的 url 发送到客户端。如果用户决定继续提取,我如何才能将相同的数据发送到另一个视图?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    • 2023-03-04
    相关资源
    最近更新 更多