Mono提供很多元件可以友善的處理頁面:可以自動将背景的值填充到頁面,可以自動進行Javascript驗證,可以自動在背景驗證等。這些功能都是比較實用的,可以減少很多開發
FormHelper是用來對應html頁面中Form内的tag的,可以自動填充textbox等
ValidationHelper可以幫助我們在前台利用Javascript驗證
Castle.Components.Validator元件可以在背景對頁面輸入值進行驗證
一、自動填充頁面
普通填充:
HomeController:

public void Fill1()
{
PropertyBag.Add("id", "1");
PropertyBag.Add("name", "GSpring");
PropertyBag.Add("sex", "1");
}
Fill1.vm:

<form >

id:$FormHelper.TextField("id")<br />

name:$FormHelper.TextField("name")<br />

sex

male:$FormHelper.RadioField("sex", "1")

female:$FormHelper.RadioField("sex", "0")

</form>
當我們執行http://****/home/Fill1.rails時會自動将對應的值綁定到頁面中去,頁面結果為:
我這裡隻是實驗了常用的textbox和radiobutton,其他的也是同樣處理的
進階填充:

public void Index()
{
PropertyBag.Add("list", new string[]
{
"value 1", "value 2"
} );
PropertyBag.Add("contacts", new Contact[]
{
new Contact("john", "address 1", "phone number 1"),
new Contact("mary", "address 2", "phone number 2")
}
Vm代碼:

<form action="Save.rails" method="post">


$FormHelper.TextField("list[0]")

$FormHelper.TextField("list[1]")


$FormHelper.TextField("contacts[0].name")

$FormHelper.TextField("contacts[0].address")

$FormHelper.TextField("contacts[0].phone")


$FormHelper.TextField("contacts[1].name")

$FormHelper.TextField("contacts[1].address")

$FormHelper.TextField("contacts[1].phone")

可以自動将對象、數組中對應的值填充到頁面上去
二、前台驗證
1、 隻能輸入數字的限制
隻需要在Vm中寫:
$FormHelper.InstallScripts()
$FormHelper.NumberField("age")
$FormHelper.NumberField("amount", "%{exceptions='32',forbid='48,49'}")
第一句是注冊腳本,第二句是生成一個textbox,并且隻能輸入數字
第三句是生成一個textbox,并且隻能輸入數字,同時可以輸入code=32的字元,同時不能輸入code=48或49的字元
2、ValidationHelper驗證
功能很強大,我這裡隻是列出一些簡單的使用,使用這種方式時幾乎不需要背景代碼,隻需要在vm檔案中定義就可以了:

<html>

<head>

<title>Validation Test</title>

$ValidationHelper.InstallScripts()

$ValidationHelper.SetSubmitOptions(true, true, false, 0)

</head>

<body>

<form method="post" id="demoForm" onsubmit="$ValidationHelper.GetValidationTriggerFunction()">

姓名:<input type="text" name="Name" id="Name" displayName="姓名" validators="blank" /><br />

密碼:<input type="password" name="Password" id="Password" validators="length|6" /><br />

郵件:<input type="text" name="Email" id="Email" validators="email|3" /><br />

确認郵件:<input type="text" name="Email_Confirm" id="Email_Confirm" validators="equalto|Email" /><br />

<input type="submit" name="Submit" value="測試" />

</form>

</body>

</html>
開始的$ValidationHelper.InstallScripts()和$ValidationHelper.SetSubmitOptions(true, true, false, 0)兩句話是注冊腳本的,不能少
然後主要就是validators屬性設定的值了,比如:blank(不能為空)、length|6(六位長度)、email(郵件類型)等
在這個例子中,當什麼也不輸,直接點測試時,會彈出一個對話框報錯:Please enter 姓名
這裡顯示的都是英文的報錯資訊,如果需要使用中文報錯,可以使用以下方法:
(由于目前MonoRail沒有提供簡體中文的報錯,需要我們自己生成)
複制MonoRail\Castle.MonoRail.Framework\Controllers目錄下的ValidationLang.resx檔案,改名為ValidationLang.zh-cn.resx,然後将此檔案中對應的英文提示改為中文,比如:

fvalidate.i18n =

{

// Validation errors

errors:

{

blank: [

["請輸入:", 0]

],
将架構項目重新編譯
然後将vm中的第四條語句改成:
$ValidationHelper.InstallScripts("zh-cn")
這樣當再次照上面的步驟執行時會彈出一個對話框報錯:請輸入:姓名
三、Castle.Components.Validator背景驗證使用
ValidatorController.cs代碼:

public class User
private int id;
private string name, email, password, confirmation;
public User()
public User(string name, string email)
this.name = name;
this.email = email;
public int Id
get { return id; }
set { id = value; }
[ValidateNonEmpty]
public string Name
get { return name; }
set { name = value; }
[ValidateNonEmpty, ValidateEmail]
public string Email
get { return email; }
set { email = value; }
public string Password
get { return password; }
set { password = value; }
[ValidateSameAs("Password")]
public string Confirmation
get { return confirmation; }
set { confirmation = value; }
}


public class ValidatorController : SmartDispatcherController
public ValidatorController()
public void Index()
public void Test([DataBind("user", Validate = true)] User user)
if (HasValidationError(user))
Flash["user"] = user;
Flash["summary"] = GetErrorSummary(user);
RedirectToReferrer();
}
else
//其他操作
CancelView();
最主要的就是User中每個字段上定義的屬性,比如ValidateNonEmpty(不能為空)、ValidateEmail(郵件格式)、ValidateSameAs(判斷是否相同)、ValidateLeng(長度判斷)、ValidateDate(日期判斷)等
index.vm:


<body>

$FormHelper.FormTag("%{action='Test', immediate='true', useLabels='true'}")


#if($summary)

<p>

<div>

發生以下錯誤:

</div>

#foreach($propName in $summary.InvalidProperties)

$propName: #foreach($msg in $summary.GetErrorsForProperty($propName)) $msg #end <br/>

#end

</p>

#end

姓名:$FormHelper.TextField("user.name")<br />

郵件:$FormHelper.TextField("user.email")<br />

密碼:$FormHelper.PasswordField("user.password")<br />

确認密碼:$Form.PasswordField("user.confirmation")<br />

<input type="submit" value="确認" />

$FormHelper.EndFormTag()

</body>

這樣,我們幾乎一句檢查的代碼都沒寫,就可以達到檢查的效果了
當然,預設的報錯資訊是英文的,我們可以修改如下定義:

[ValidateNonEmpty("不能為空", FriendlyName="姓名")]

那麼在姓名列沒輸入時會報錯:姓名: 不能為空
其實User類的定義就相當于一張表的Model,在Monorail中把Model定義好,就可以達到驗證的功能了
本文轉自永春部落格園部落格,原文連結:http://www.cnblogs.com/firstyi/archive/2007/10/31/944282.html,如需轉載請自行聯系原作者