2012-06-09 56 views
2

如何在返回視圖時保持相同的數據?如何在返回視圖時保持相同的數據?

我試圖把形式返回到視圖,但它沒有工作。

有沒有什麼好的和簡單的方法來做到這一點?

[HttpPost] 
public ActionResult Register(FormCollection form) 
{ 
    string name = form["Name"].Trim(); 
    if (string.IsNullOrEmpty(name)) 
    { 
     TempData["TempData"] = "Please provide your name "; 
     return View(form); 
    } 

    string email = form["Email"].Trim(); 
    var isEmail = Regex.IsMatch(email, @"(\w+)@(\w+)\.(\w+)"); 
    if (!isEmail) 
    { 
     TempData["TempData"] = "Sorry, your email is not correct."; 
     return View(form); 
    } 

     //do some things 
} 
+0

只是好奇你爲什麼要使用FormCollection而不是ViewModel。它會讓你的生活更容易,尤其是這個問題:-) –

+1

向我們展示渲染視圖的動作,這樣我們就可以根據你的代碼給出正確的答案。這一切都取決於那種方法 –

+0

我也有同感。註冊的GET方法如何?你在那裏使用什麼模型?爲什麼你不能在POST中使用同一個模型? –

回答

3

不知道爲什麼你會使用在後FormCollection,但也許你來自一個WebForms的背景。在MVC中,您應該使用ViewModels將數據傳輸到Views或從Views傳輸數據。

默認情況下,MVC 3應用程序中的Register方法在Register視圖中使用ViewModel。你應該簡單地發回。實際上,如果您不知道它是Internet模板的一部分,則默認應用程序已經爲您創建了。

標準模式是讓ViewModel代表您在View中使用的數據。例如,你的情況:

public class RegisterViewModel { 

    [Required] 
    public string Name { get; set; } 

    [Required] 
    [DataType(DataType.EmailAddress)] 
    [Display(Name = "Email address")] 
    public string Email { get; set; } 
} 

你的控制器應包含2個動作,一個GetPostGet呈現視圖併爲用戶輸入數據做好準備。在提交後查看Post行動然後被調用。視圖將ViewModel發送到動作,然後該方法採取行動來驗證和保存數據。

如果數據存在驗證錯誤,將ViewModel返回到視圖並顯示錯誤消息非常簡單。

這裏是Get行動:

public ActionResult Register() { 
    var model = new RegisterViewModel(); 
    return View(model); 
} 

這裏是Post行動:

[HttpPost] 
public ActionResult Register(RegisterViewModel model) { 
    if(ModelState.IsValid) { // this validates the data, if something was required, etc... 
     // save the data here 
    } 
    return View(model); // else, if the model had validation errors, this will re-render the same view with the original data 
} 

你的看法會是這個樣子

@model RegisterViewModel 

@using (Html.BeginForm()) { 
    @Html.ValidationSummary(true) 
    <div class="editor-label"> 
     @Html.LabelFor(model => model.Name) 
    </div> 
    <div class="editor-field"> 
     @Html.TextBoxFor(model => model.Name) <br /> 
     @Html.ValidationMessageFor(model => model.Name) 
    </div> 
    <div class="editor-label"> 
     @Html.LabelFor(model => model.Email) 
    </div> 
    <div class="editor-field"> 
     @Html.TextBoxFor(model => model.Email) <br /> 
     @Html.ValidationMessageFor(model => model.Email) 
    </div> 
} 

使用其他策略來捕捉並將數據保存在MVC應用程序中是絕對有可能的一個非常可擴展的框架。但是有一個特定的模式可以使MVC發揮作用,並且與這種模式相互作用有時會證明很困難。對於初學者來說,最好首先了解首選的模式和策略,然後一旦理解得很好,就可以採用一些自己定製的策略來滿足您的需求。那時你應該理解系統,以便知道你需要改變什麼以及在哪裏。

快樂編碼!

+0

謝謝你的建議。 :) –

相關問題