我在 ASPCore MVC 中有一個應用程式。
我的目標是調整模型以自動將電子郵件地址大寫。這似乎比調整每個控制器要好。
經過一番研究,我在下面找到了這個解決方案,以修改屬性支持者。
public class PostFou
{
private string _name;
private string _email;
private string _address;
[Key]
public int FouId { get; set; }
[Display(Name = "Full Name")]
[RegularExpression(@"[a-zA-Z0-9""'\s-|\.\=\ \*\/\\]*$")]
[StringLength(45)]
public string FouName { get; set; }
[Display(Name = "Phone")]
[RegularExpression(@"[0-9]*$")]
[StringLength(20)]
[DataType(DataType.PhoneNumber)]
public string FouPhon { get; set; }
[Display(Name = "Email")]
[StringLength(45)]
public string FouEmai //{ get; set; }
{
get { return _email; }
set { _email = value.ToUpper(); }
}
}
問題是現在我所有的 linq 查詢都回傳了一個 nullReference 例外,這是一件看似無關的事情。例如,在我的剃刀視圖中,我有以下代碼
@foreach (var item in Model) { //error occurs here
<tr>
<td>
@Html.DisplayFor(modelItem => item.FouZero)
</td>
<td>
@Html.DisplayFor(modelItem => item.FouName)
</td>
<td>
@Html.DisplayFor(modelItem => item.FouPhon)
</td>
<td>
@Html.DisplayFor(modelItem => item.FouEmai)
</td>
在控制器中,對于這個視圖,有一個 Linq 簡單查詢:
public IActionResult Index(string searchString)
{
var titles = _context.PostFous.Where(m =>
m.FouZero.Contains(searchString) ||
m.FouName.Contains(searchString) ||
m.FouEmai.Contains(searchString)
);
//return View(await _context.PostFous.ToListAsync());
return View(titles);
}
在除錯中,盡我所能深入挖掘,我發現了這條訊息,始終貫穿錯誤:
at lambda_method(Closure , QueryContext , DbDataReader , ResultContext , Int32[] , ResultCoordinator )
我不確定那是什么意思。
問題是,出了什么問題?鑒于這是一個廣泛的問題,更狹義地說,在調整財產支持時,我是否還應該調整其他東西?跟進,有沒有不同的方法來實作我在模型中自動大寫電子郵件地址的目標?
我想避免對資料庫進行更改,并將其保留在應用程式中。
uj5u.com熱心網友回復:
我的猜測是該欄位在資料中可能為空。這意味著您的 setter 需要處理 DB 行可能具有 #null 電子郵件地址的事實,并且您的過濾器查詢也將:
[Display(Name = "Email")]
[StringLength(45)]
public string FouEmai //{ get; set; }
{
get { return _email; }
set
{
if (value == null)
_email = null;
else
_email = value.ToUpper();
}
}
然后查詢時:
var titles = _context.PostFous.Where(m =>
m.FouZero.Contains(searchString) ||
m.FouName.Contains(searchString) ||
(m.FouEmai != null && m.FouEmai.Contains(searchString))
);
出于性能考慮,我建議將文本匹配搜索默認設定為默認BeginsWith()用戶應輸入的值以開頭而不是Contains. 例如,如果他們鍵入“mark”,那么他們通常會尋找以“mark”開頭的名稱/電子郵件,但如果他們沒有找到匹配項并希望更開放地搜索“%”或“*”常見通配符. 這樣他們就可以選擇為Contains. 這為他們提供了靈活性,同時有助于確保大多數此類查詢可以更好地執行。
uj5u.com熱心網友回復:
我再次嘗試并重現了類似的錯誤:


在第一種情況下,PostFou 物體的 FouNum 屬性不能為空,
在 db 中,FouNum 列可能為空
如果 db 中的資料沒有與屬性共享相同的型別,它也會得到類似的錯誤
您可以檢查是否有任何 int 屬性型別(在您的情況下可能是 FouNum?),并與我們分享更詳細的資訊
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/525344.html
