2009-12-03 38 views
0

我的強類型View從Linq創建的「Person」對象繼承到SQL。在我的「編輯」來看,我不得不顯示,舊值:模型綁定和顯示修剪字符串屬性

<%= Html.TextBox("FirstName") %> 

「姓」是NCHAR,所以它需要修剪。所以我結束了:

<%= Html.TextBox("FirstName", Model.FirstName.Trim()) %> 

和這個工程。但是,當表單提交(POST)之後,並出現一些錯誤,我需要再次顯示:

[AcceptVerbsAttribute(HttpVerbs.Post), Authorize(Roles = "office"), HandleError] 
public ActionResult Edit(Models.Person person) 
{ 
    if (!(_personService.ValidatePerson(person))) // Persona non valida 
    { return View(person); } 
} 

如果由於某種原因,用戶離開文本框「名字」 空白,所產生的財產Person.FirstName變成null和Model.FirstName.Trim()拋出一個異常(對象引用未設置爲對象的實例)。

任何方式來修改綁定,並默認所有的字符串修剪?或者如何解決這個問題的任何想法

更新:似乎證實是一個MVC 2的行爲..仍然在尋找一個好辦法來處理這個問題。實際使用的擴展方法:

public static string TrimOrDefault(this string value) 
{ 
    return value != null ? value.Trim() : string.Empty; 
} 
+0

@gremo檢查我的編輯你的部分類的例子。 – griegs 2009-12-03 03:44:20

回答

1

這裏有些奇怪。

Model.FirstName不能爲空;模型聯編程序足夠智能,可將空輸入字段(文本框)設置爲「」。確保你的屬性名稱與你的模型和你使用的文本框匹配。

您正在使用哪個版本的MVC? 1或2?我在VS 2008中運行了一個MVC 1版本,我唯一可以讓FirstName變爲null的方式是根本不包含它。

我可以看到,如果你最初的GET編輯觀點拋出這個錯誤,你有名字集您的dbml和數據庫可空,但因爲它是一個帖子這樣做沒有意義,我現在。 ;)

更新:

我已經證實了這一點:

有了一個空的形式:

  • VS 2008 - 1的mvc - 姓= 「」
  • VS 2010 - MVC 2 - 姓= NULL

嗯哦...這就是要打破很多代碼...

驗證碼:

視圖(兩者相同):

<% using (Html.BeginForm()) {%> 

    <fieldset> 
     <legend>Fields</legend> 
     <p> 
      <label for="FirstName">FirstName:</label> 
      <%= Html.TextBox("FirstName", Model.FirstName) %> 
      <%= Html.ValidationMessage("FirstName", "*") %> 
     </p> 
     <p> 
      <label for="LastName">LastName:</label> 
      <%= Html.TextBox("LastName", Model.LastName) %> 
      <%= Html.ValidationMessage("LastName", "*") %> 
     </p> 
     <p> 
      <input type="submit" value="Save" /> 
     </p> 
    </fieldset> 

<% } %> 

VS 2010 - MVC 2

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     ViewData["Message"] = "Welcome to ASP.NET MVC!"; 

     return View(); 
    } 

    public ActionResult About() 
    { 
     return View(); 
    } 

    public ActionResult AddPerson() 
    { 
     var person = new Person(); 

     return View(person); 
    } 

    [HttpPost] 
    public ActionResult AddPerson(Person person) 
    { 
     return View(person); 
    } 
} 

public class Person 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

2008 VS - 1的mvc

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     ViewData["Message"] = "Welcome to ASP.NET MVC!"; 

     return View(); 
    } 

    public ActionResult About() 
    { 
     return View(); 
    } 


    public ActionResult AddPerson() 
    { 
     var person = new Person(); 

     return View(person); 
    } 

    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult AddPerson(Person person) 
    { 

     return View(person); 
    } 
} 

public class Person 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

沒有乾淨的修復atm。模型聯編程序實際上將這些屬性設置爲null。在構造函數中將First和Last設置爲「」,並將這些屬性從綁定中排除:[Bind(Exclude =「FirstName,LastName」)]]。

這是什麼地方記錄?

+0

我正在考慮這個想法。在傳遞給Edit方法時(即在它碰到驗證服務之前),是否調試了person對象,以查看此時名字是空還是空? person對象是否在驗證服務中被修改並在那裏被設置爲null?您是否使用Model.ModelState.AddModelError將驗證錯誤添加到模型狀態?如果是的話,你也使用Model.ModelState.SetModelValue(它們作爲一對工作,忽略SetModelValue觸發奇怪的空錯誤)。 – 2009-12-03 04:19:57

+0

Debuggin顯示人物屬性例如提交後「LastName」爲空(如果我在相應的文本框中將其設置爲空白),緊跟在代碼的第一行之後。名稱匹配。版本2與2010測試版1.姓氏我nchar(30)不爲空... 謝謝 – gremo 2009-12-03 04:36:01

+0

這裏有更多關於null與string.Empty的事情:http://stackoverflow.com/questions/1263563/modelbinding-for-empty -query串參數-在-ASP淨MVC-2 – 2010-01-18 02:09:30

0

在Models.Person具有默認值是的String.Empty應至少elminate空誤差。

如果你想讓它自動化,那麼你可以將它添加到你的dbml文件中。附有一個designer.cs文件,每個字段都有一個getter和setter。如果您願意,您可以在其中添加代碼。

你也可以創建一個基於你的表的部分類,並處理其中的修剪。這意味着如果您對dbml文件進行更改,則不會丟失更改。

如果您不使用dbml文件,請告訴我們。

編輯

如果你有一個叫做人在你的dbml文件,那麼這將已經被宣佈爲部分類。

在同一個項目中創建另一個類,並執行以下操作:

public partial class Person 
{ 
    public string NewName 
    { 
     get { return this._name.Trim(); } 
    } 
} 

所以從那時起,你可以使用.NewName而不是名字,它會回來修剪。您還可以在其中添加代碼以確保它不爲空,而不是紅色,而不是任何並返回適當的值。

+0

看起來好,但我需要知道如何創建部分類。我真的很新的MVC和一般的asp.net ...任何人都可以指向我如何編輯dbml文件或創建部分類的正確方向? – gremo 2009-12-03 03:22:44

+0

生成designer.cs文件。修改它,然後更改您的dbml意味着所有的更改都消失了。 – jfar 2009-12-03 03:27:53

+0

是的,我說過!這就是爲什麼我添加了關於部分類的一點。 – griegs 2009-12-03 03:35:20

-1

我不知道這樣做的擴展方法,如果別人做的話請讓我知道。

我爲可能爲空的字段創建了一個簡單的HTML幫助器。

public static string TrimOrDefault(string value) 
{ 
    return (value == null ? "" : value.Trim()); 
} 

然後在你的代碼,你可以使用

<%= Html.TextBox("FirstName", Helpers.TrimOrDefault(Model.FirstName)) %> 

它的可重複使用的可空未來的領域和讀取容易。

+1

羽絨選民。我相信你有一個解決方案,因此你downvote?這實際上是一個可以接受的解 – griegs 2009-12-03 03:45:33

+0

「任何方式來修改綁定,並默認修整所有的字符串?」 您的答案與模型綁定,只有HTML輸出無關。你給他的例子代碼,他已經使用擴展方法而不是Trim()這次:<%= Html.TextBox(「FirstName」,Model.FirstName.Trim())%> – jfar 2009-12-03 03:46:56

+0

「或任何想法如何解決這個問題?」 該幫手是一個簡單的解決方案來處理空字段。 – Odd 2009-12-03 03:49:40