1

我正在编写我的第一个 ASP.NET MVC 4 应用程序,并且正在努力弄清楚我所做的是否是一种好方法、过度杀伤或只是愚蠢。

我知道有一百万种方法可以做事,但只是在寻找一些最佳实践指导。

基本上,我的索引视图呈现一个简单的表单,在 POST 上我正在创建一个 PDF,将其存储在会话和 ViewBag 中,并将其传递给 Confirm 操作。所有 Confirm 操作都用于显示视图 (Confirm.cshtml)。

有人可以在这里指导我吗?

控制器

public class HomeController : Controller
{
    //
    // GET: /Home/

    public ActionResult Index()
    {
        return View();
    }

    [HttpPost]
    public ActionResult Index(FormCollection formCollection)
    {

        // Create PDF
        var doc = new Document();
        MemoryStream memoryStream = new MemoryStream();

        PdfWriter writer = PdfWriter.GetInstance(doc, memoryStream);

        doc.Open();
        doc.Add(new Paragraph("First Paragraph"));
        doc.Add(new Paragraph("Second Paragraph"));
        doc.Close();

        byte[] docData = memoryStream.GetBuffer(); // get the generated PDF as raw data

        // create id and store data in Session
        var id = Guid.NewGuid().ToString();
        Session[id] = docData;

        // store the id in ViewBag
        ViewBag.id = id;

        return View("Confirm");
    }

    // Handles the /Home/Confirm view
    public ActionResult Confirm()
    {
        return View();
    }

    public ActionResult Download(string id)
    {
        var docData = (byte[]) Session[id];

        if (docData == null) {
            return HttpNotFound();
        }

        Session[id] = null;

        return File(docData, "application/pdf", "test.pdf");
    }

}

看法

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Confirm</title>
</head>
<body>
    <div>
        <a href="/Home/Download?id=@ViewBag.id">Download PDF</a>
    </div>
</body>
</html>
4

1 回答 1

3

从 MVC 的角度来看:

使用 ViewModel 是一个很好的实践,请查看本教程。

http://www.asp.net/mvc/tutorials/older-versions/nerddinner/use-viewdata-and-implement-viewmodel-classes

一些优点:

视图模型将视图与模型类隔离开来,并允许模型独立于视图演化。

这可以在视图模板中实现类型安全、编译时检查和编辑器智能感知。

安全性,如果您将对象直接从 ORM 公开到视图,则可能会操纵 IsAdmin 等属性,使用视图模型可以限制这一点。

我会在索引发布操作中更改的内容

return View("Confirm");

到:

return RedirectToAction("Confirm");

因为:

Post/Redirect/Get (PRG) 是一种 Web 开发设计模式,可防止某些重复的表单提交

http://en.wikipedia.org/wiki/Post/Redirect/Get

于 2012-11-22T21:32:50.750 回答