2013-01-15 49 views
0

我在我的註冊頁面上使用了@Html.ValidationSummary()。如果輸入的用戶名已被使用,我得到了以下信息HTML:如何檢查將使用@ Html.ValidationSummary()顯示的文本,然後修改郵件?

<div class="validation-summary-errors" data-valmsg-summary="true"> 
    <ul> 
     <li>User name already exists. Please enter a different user name.</li> 
    </ul> 

我想什麼是能夠這樣,如果消息是修改此消息與HTML的幾行與上面完全一樣,然後我將添加一些顯示登錄鏈接的HTML。事情是這樣的:

<div class="validation-summary-errors" data-valmsg-summary="true"> 
    <ul> 
     <li>User name already exists. Please enter a different user name or <a xxxx>Login</a></li> 
    </ul> 
</div> 

我試圖做類似如下:

@{ 
    var errorHTML = @Html.ValidationSummary(); 
    if (errorHTML.IndexOf("User name already exists") > 0 ) { 
     errorHTML = errorHTML + "xx" 
    }      
} 

不過我馬上來到的地方告訴我,MvsHtmlString不包含的IndexOf的定義問題。

有人可以提出一種方法,我可以檢查,看看是否會有一個驗證消息說用戶名已經存在,然後添加一些HTML並顯示在屏幕上?控制錯誤消息顯示驗證錯誤

回答

0

的一種方法是使用ModelState.AddModelError()方法

ModelState.AddModelError("UserName", "User name already exists. Please enter a different user name or a xxxx");

@When Html.ValidationSummary()被執行時,將示出上述消息。

但是,我不知道當前消息如何被包含在摘要中,以及您是否有控制權。換句話說,該消息來自哪裏?

+0

你有一個好點的我發現相同的錯誤消息來自我的MVC代碼中的視圖位置:ModelState.AddModelError(「UserName」,「用戶名已存在,請輸入不同的用戶名。」);我只是想,而不是在源頭上改變它,那麼最好檢查它並在視圖上修改它。你怎麼看? – Melina

+0

我強烈建議在源代碼中改變消息(在視圖中),這樣做會少得多。 –

+0

但源是我的ASP MVC控制器,而不是視圖。 – Melina

0

您可以編寫自定義驗證摘要。然後使用Html.ValidationSummary()獲取MvcHtmlString並更改消息。 下面是關於如何創建自定義的驗證摘要擴展了幾個有用的鏈接: Custom ValidationSummary template Asp.net MVC 3 How to extend the ValidationSummary HTML Helper in ASP.NET MVC?

+0

但是你認爲改變它很好嗎?我仍然認爲在我需要改變它的一點上改變它可能更有意義,這僅僅是爲了一些觀點。如果我能在剃刀代碼中檢查它,它可能會更清潔一些。 – Melina

0

你可以寫一個行爲過濾器會檢查ModelState中的一個條目匹配你在找什麼,然後要麼修改或刪除它。然後,你可以裝點只有你想過濾器的操作:

[RemoveModelStateEntry(MatchOn = "Username already exists.")] 
public ActionResult Index() 
{ 
    return View(); 
} 

當執行行動,並提出了在它之前,你可以檢查模型的狀態:

public class RemoveModelStateEntryAttribute : IActionFilter 
{ 
    public void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     // check filterContext.Controller.ViewData.ModelState here 
    } 

    public void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     // nothing to do here 
    } 
} 
相關問題