2011-12-05 70 views

回答

24

我不確定是否有可能使用p aragraph而不是默認span,因爲它可能使val idation插件來放置錯誤消息。但對於divs,這很容易 - 你可以編寫自定義的html助手。

沿着這些線(可能需要進一步的測試/編碼)。您需要在視圖中包含此靜態擴展方法的命名空間,或者直接將其放入System.Web.Mvc.Html

public static class Validator 
{ 
    public static MvcHtmlString MyValidationMessageFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression) 
    { 
     TagBuilder containerDivBuilder = new TagBuilder("div"); 
     containerDivBuilder.AddCssClass("field-error-box"); 

     TagBuilder topDivBuilder = new TagBuilder("div"); 
     topDivBuilder.AddCssClass("top"); 

     TagBuilder midDivBuilder = new TagBuilder("div"); 
     midDivBuilder.AddCssClass("mid"); 
     midDivBuilder.InnerHtml = helper.ValidationMessageFor(expression).ToString(); 

     containerDivBuilder.InnerHtml += topDivBuilder.ToString(TagRenderMode.Normal); 
     containerDivBuilder.InnerHtml += midDivBuilder.ToString(TagRenderMode.Normal); 

     return MvcHtmlString.Create(containerDivBuilder.ToString(TagRenderMode.Normal)); 
    } 
} 

正如你看到的,這個使用默認ValidationMessageFor方法,不使用驗證,插件錯誤消息處理干擾。

而且你使用這個簡單的,因爲默認的驗證消息幫手

@Html.MyValidationMessageFor(model => model.SomeRequiredField) 
+0

這就是我正在尋找的。我還沒有理解驗證插件的問題,但我會研究這個問題。謝謝! – parleer

+3

這對我來說很好,但一定要在System.Web.Mvc.Html命名空間中聲明您的靜態助手類,它將會非常好地工作。 –

+1

你如何改變'ValidationMessageFor'消息生成的html。我不是在說把它換成另一個div。可能嗎? –

-2

是,只使用一個元模型領域:

[MetadataType(typeof(YourMetaData))] 
public partial class YOURCLASS 
{ 
    [Bind(Exclude = "objID")] 
    public class YourMetaData 
    { 
     [Required(AllowEmptyStrings = false, ErrorMessage = "Please enter a name")] 
     public object Name { get; set; } 
    } 
} 

在外地的ErrorMessage :) 希望這有助於改變你的留言: )

+0

他想自定義html,而不是自定義錯誤消息 – archil

+0

opps,我想我錯了 – shennyL

3

您可以實現自己的ValidationMessageFor助手發出所需輸出或使用一些JavaScript來添加/修改所提供的HTML代碼,但自ValidationMessageFor實施是更清潔的方法恕我直言。

要實現您自己的ValidationMessageFor幫助器,請查看ASP.NET MVC源代碼中的ValidationExtensions.ValidationMessageFor和ValidationMessageHelper方法。

實施提示

由於GetFormContextForClientValidation是內部的,你必須在你的代碼複製內部功能來解決,落實:

FormContext formContext = htmlHelper.ViewContext.ClientValidationEnabled ? htmlHelper.ViewContext.FormContext : null; 

一些其他的方法都是私有像GetUserErrorMessageOrDefault你會ValidationExtensions還需要複製該代碼。你可以做什麼來避免重複代碼是讓ValidationExtentensions.ValidationMessageFor呈現包含在一個範圍內的驗證消息字符串,然後根據你的需求改變呈現的字符串。請記住,如果沒有發現錯誤,則返回「null」,並且如果啓用了不顯眼的JavaScript,則需要data-HTML屬性。

您可以從here

2

下載ASP.NET MVC 3的源代碼默認標籤生成的變化唯一需要的是在我的情況下,橫跨在是煩人保證金設置的行爲結果。

我使用解決了這個「顯示:塊」

也許這可以幫助一些人..

7

我用另一種方式:

public static MvcHtmlString DivValidationMessageFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression) 
    { 
     return MvcHtmlString.Create(htmlHelper.ValidationMessageFor(expression).ToString().Replace("span", "div")); 
    } 

這樣,您就可以使用內置的方式,而是用一個div取代跨度。

如果您需要該函數的任何其他重載,則根據需要進行重複。

+0

我喜歡這種方法。比複製所有的ValidationMessageHelper代碼更容易,這樣一個小小的改變。 –

+0

希望你不要驗證兩個timepans之間的日期.. – user2864740

0

也許你可以把這些代碼

string propertyName = ExpressionHelper.GetExpressionText(expression); 
string name = helper.AttributeEncode(helper.ViewData.TemplateInfo.GetFullHtmlFieldName(propertyName)); 

if (helper.ViewData.ModelState[name] == null || 
    helper.ViewData.ModelState[name].Errors == null || 
    helper.ViewData.ModelState[name].Errors.Count == 0) 
    { 
     return MvcHtmlString.Empty; 
    } 

在回答功能的頂部,使DIV不會對負載形式出現。

相關問題