2012-11-22 47 views
1

我正在編寫我的第一個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/[email protected]">Download PDF</a> 
    </div> 
</body> 
</html> 
+1

你想要代碼審查或你想要什麼? –

+0

我想是的... – Zinc

回答

3

從一個MVC點:

使用的ViewModels是一個很好的做法,以進入,看看這個教程。

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

一些優點:

視圖模型隔離模型類的視圖,並允許該模型獨立於視圖的演變。

這使得視圖模板中的類型安全,編譯時檢查和編輯器智能感知成爲可能。安全性:如果將對象直接從ORM暴露給View,那麼可以使用像IsAdmin這樣的屬性進行操作,使用View Models可以限制這一點。

是我會在指數POST操作

return View("Confirm"); 

要改變:

return RedirectToAction("Confirm"); 

監守:

郵政/重定向/獲取(PRG)是一種Web開發設計防止一些重複表單提交的模式

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

+1

我明白了 - 但是當我做這個ViewBag不再工作? – Zinc

+0

使用ViewModels的另一個很好的理由,你可以重定向並傳遞一個模型作爲參數,例如返回RedirectToAction(「Confirm」,Model);作爲類似於ViewBag的替代方案是TempData [「key」],它將一直存在,直到http請求並在此之後自動刪除。語法就像ViewData。更多信息:http://www.devcurry.com/2012/05/what-is-aspnet-mvc-tempdata.html – SimonGates

+0

還沒有嘗試過,但聽起來正是我需要的將接受你的答案。謝謝! – Zinc