形成岗位最佳实践

时间:2012-11-22 20:56:06

标签: c# asp.net-mvc

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

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

基本上我的索引视图呈现一个简单的表单,在POST上我创建了一个PDF,将它存储在会话和ViewBag中并将其传递给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>

1 个答案:

答案 0 :(得分:3)

从MVC的角度来看:

使用ViewModel是一个很好的练习,请看一下本教程。

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

一些优势:

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

这样可以在视图模板中启用类型安全,编译时检查和编辑器智能感知。

安全性,如果您将对象直接从ORM暴露给View,则可以操纵IsAdmin等属性,使用View Models可以限制它。

我会在Index Post Action中更改

return View("Confirm");

要:

return RedirectToAction("Confirm");

监守:

发布/重定向/获取(PRG)是一种Web开发设计模式,可防止一些重复的表单提交

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