2013-07-30 48 views
0

我實際的問題是在這裏:Clinetside regular expression validation in MVC4UIHint和正則表達式註釋不一起工作MVC4

我的模式是:

public partial class PartyRole 
{ 
[UIHint("TextBox")] 
[RegularExpression(@"^.{5,}$", ErrorMessage="Minimum 5 characters required")] 
[StringLength(50, ErrorMessage="Maximum {2} characters exceeded")] 
public string Title { get; set; } 
} 

我uihint模板(TextBox.cshtml)

@Html.TextBoxFor(m => Model, new {@class="txt"}) 

如果我不使用UIHint,所有驗證消息都呈現給客戶端。 如果我使用UIHInt,我的正則表達式的驗證屬性在客戶端生成並且驗證正在從服務器發生。

也,我已經重寫了object.cshtml

@functions 
{ 
bool ShouldShow (ModelMetadata metadata) 
{ 
    return metadata.ShowForEdit 
     && metadata.ModelType != typeof(System.Data.EntityState) 
     && !metadata.IsComplexType 
     && !ViewData.TemplateInfo.Visited(metadata); 
} 
} 

@if (ViewData.TemplateInfo.TemplateDepth > 1) 
{ 
if (Model == null) 
{ 
    @ViewData.ModelMetadata.NullDisplayText 
} 
else 
{ 
    @ViewData.ModelMetadata.SimpleDisplayText 
} 
} 
else 
{ 
ViewData.Clear(); 

foreach (var prop in ViewData.ModelMetadata.Properties.Where(pm => ShouldShow(pm))) 
{ 
    if (prop.HideSurroundingHtml) 
    { 
     @Html.Editor(prop.PropertyName) 
    } 
    else if (prop.DisplayName == "Id") 
    { 
     <div></div> 
    } 
    else if (!string.IsNullOrEmpty(Html.Label(prop.PropertyName).ToHtmlString())) 
    { 
     <div class="editor-label">@Html.Label(prop.PropertyName)</div> 
    } 
    <div class="editor-field">@Html.Editor(prop.PropertyName) @Html.ValidationMessage(prop.PropertyName, "")</div> 
} 
} 

不知道這是否造成任何問題。

有人可以提醒我在這裏做錯了什麼?

回答

1

這是事情。不顯眼的客戶端驗證使用在您的<input>字段上生成的HTML5數據屬性。當您刪除UIHint,您的自定義模板不再被使用,如果你檢查生成的標記,你會看到<input>領域上有data-*屬性:

<input class="input-validation-error text-box single-line" data-val="true" data-val-length="Maximum 0 characters exceeded" data-val-length-max="50" data-val-regex="Minimum 5 characters required" data-val-regex-pattern="^.{5,}$" id="Title" name="Title" type="text" value="1" /> 

現在,如果你把你的UIHint並查看生成的HTML,您將看到:

<input class="txt" id="Title" name="Title" type="text" value="some title" /> 

好吧,這解釋了爲什麼您的代碼不起作用。

現在你可能想知道爲什麼你的模板中沒有data- *屬性?因爲HTML助手(如Html.TextBoxFor)僅在將它們放置在表單內時纔會生成這些屬性。所以你必須作弊並手動實例化一個FormContext來誘使幫助者認爲它是在一個表單中使用的。其實有一個Html.BeginForm但這種形式是在你的主視圖和模板內的幫手不知道。把它稱爲一個錯誤或任何東西,但事情是這樣的。

所以,你可以簡單地在你的模板創建FormContext:

@{ 
    this.ViewContext.FormContext = new FormContext(); 
} 

@Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue, new { @class="txt" }) 

,現在你的<input>領域將有必要的數據 - *屬性就可以了,這樣不引人注目的驗證按預期工作。

+0

非常感謝你..這就像一個魅力!!!!! – mmssaann