簡體   English   中英

ASP.NET MVC驗證和視圖

[英]ASP.NET MVC validation and views

我正在使用MVC來驗證頁面上的一些html文本框,例如在我的控制器中

        if (String.IsNullOrEmpty(name))
        {
            ModelState.AddModelError("name", "You must specify a name.");
        }


        if (ViewData.ModelState.IsValid)
        {
            return RedirectToAction("Index");
        }

return View();

問題出在這里,如果驗證失敗,則返回View(“Add”)失敗的原因是控制器不處理返回視圖()的視圖,一個選項是使用RedirectToView(“viewname”); 並且它將正常工作除了它沒有通過驗證AddModelError的東西(“它就像第一次加載頁面”)。

我可以通過在返回View()之前重復填充SelectList框的代碼來解決這個問題。

像這樣

        ViewData["rooms"] = new SelectList(Villa.intList(10));
        ViewData["sleeps"] = new SelectList(Villa.intList(20));
        ViewData["accomodationType"] = new SelectList(accomodationList, "accomodationId", "accomodationType");
        ViewData["regionName"] = new SelectList(regionList, "regionId", "regionName");
        return View();

但是,我認為有一種更好的方法,而不是重復那段代碼,有沒有人知道任何返回重定向視圖並傳遞模型錯誤的方法?

在此先感謝,希望它有一定道理。

獲取用於在(GET)添加操作中初始化ViewData的代碼,並將其重構(提取方法)為獨立的私有方法。 從您的(GET)添加操作中調用該方法。 現在在POST操作中(也就是我猜想,你在上面顯示的內容;目前尚不清楚)你可以調用相同的私有方法來填充ViewData。 現在您不再有任何重復的代碼。 請記住,ViewData是Controller類型的屬性,因此您可以將其設置在任何位置,而不僅僅是在action方法本身。

我必須承認,我對你的意思有些疑惑,所以這是一個通用的答案,可能不准確!

http://weblogs.asp.net/scottgu/archive/2008/09/02/asp-net-mvc-preview-5-and-form-posting-scenarios.aspx

這是一個很好的閱讀。

我可以想到兩種方式。

要更改最少量的代碼,只需將ViewData放在TempData中,然后在Redirect中檢索它。

可能更容易接受的答案是使用上面鏈接中描述的方法。 讓您的表單回復相同的操作。 該操作將有兩個實現 - 一個Post和一個Get。 在Post操作中,執行所有驗證邏輯。 如果驗證有效,請對成功顯示的任何視圖執行重定向操作(Post-Redirect-Get模式)。 如果驗證失敗,則重新顯示表單的相同視圖,並顯示驗證錯誤。

如果這不是你問的問題,那就知道〜

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM