2010-12-17 24 views
1

我的模型已經過正確驗證。如果我在調試過程中驗證結果達到峯值,我會看到一切正確。但是,全部我的驗證結果將顯示,即使只有一個是無效的。同樣,在調試期間,只有一個字段被正確地顯示出來的驗證結果,但是當我的觀點被渲染所有的顯示:Html.ValidationMessage在所有字段上呈現,無論它們是否有效

[HttpPost] 
public ActionResult Create(Widget widget) 
{ 
     if (widge.Valid) 
     { 
     // Save to db 
     } 

     retun View(widget); 
} 

我的觀點:

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="true" Inherits="System.Web.Mvc.ViewPage<Widget>" %> 
// took out a lot of html here 
<form action="Create" method="post"> 
<input name="Widget.City" value="<%= Model.City == null ? "" : Model.City%>" /> 
<%= Html.ValidationMessage("Widget.City")%> 
<input name="Widget.Department" value="<%= Model.Department == null ? "" : Model.Department %>" /> 
<%= Html.ValidationMessage("Widget.Department")%> 
<button type="submit">Save</button> 
</form> 

讓我們說城市和部在我的模型中設置爲NotNull,並且我正確放入城市,但將部門留空。同樣,它會顯示它在控制器上無效,財產部門有問題,但在我看來,我將得到兩個屬性的「可能不爲空」消息。如果我在視圖中有4個屬性和4個ValidationMessage標記,即使一個屬性無效...所有4個都會顯示。這是怎麼回事?

回答

0

如果我沒有記錯的話,我想你想使用

Html.ValidationMessageFor(model => model.City) 

你在你的視圖中使用今非昔比當前。

另外...既然你使用的是強類型視圖,你應該檢查ModelState.IsValid來確定你是否應該保存你的Widget。這就是說,如果您在視圖模型上使用數據註釋。

+0

如果我使用強類型版本...什麼也不顯示。我相信這是因爲Html.ValidationMessageFor只呈現最後一個屬性,所以它變成了Html.ValidationMessage(「City」),我需要Html.ValidationMessage(「Widget.City」)...但我可能是錯的。 – user500038 2010-12-17 20:00:34

+0

我其實剛剛完成了一個項目,我不得不這樣做,它爲我工作。 ValidationMessageFor不關心視圖模型中屬性的淺或深。例如,在我正在處理的項目中,我在強類型視圖中使用了類似以下內容:Html.ValidationMessageFor(model => model.MySubObject.MyProperty) – Anthony 2010-12-17 20:06:12

+0

您是否在視圖模型上設置了任何驗證註釋? – Anthony 2010-12-17 20:07:12

0

你用什麼作爲輸入到[HttpGet]視圖的動作?

由於您使用的格式Widget.Property視圖預計該模型有一個包含數據的控件窗口小部件屬性..即它正在尋找Model.Widget.Property,但你的模型只包含Model.Property。根據此處發佈的代碼,您只是將窗口小部件傳遞迴視圖,並將其解釋爲具有NULL Widget屬性,從而觸發所有NotNull驗證。

此處的解決方案是將Widget發佈模型(您在[HttpPost]操作中接受的內容)分配給您傳回視圖的模型的Widget屬性。

public class CreateViewModel 
{ 
    public Widget Widget { get; set; } 
} 


[HttpPost] 
public ActionResult Create(Widget widget) 
{ 
     if (widge.Valid) 
     { 
     // Save to db 
     } 
     var viewModel = new CreateModel() { Widget = widget }; 

     retun View(viewModel); 
} 

希望我明確指出正確的。它的一個漫長的一天=)

相關問題