我正在开发一个asp.net mvc web应用程序,目前我在处理字符串时遇到一些问题,主要是因为: -
在begging和end中插入或编辑带有空格的值。
编辑字段时检查字符串唯一性。
对于第一个问题,我有以下行动方法: -
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(DataCenter dc)
{
数据中心有一个名为“Name”的属性。现在,如果用户插入诸如“ABC”和“ABC”之类的值,它们将作为两个不同的值保存在SQL服务器上。虽然我已经在数据库上定义了一个独特的约束。因此,我找到解决此问题的最佳方法是将我的操作方法修改为如下:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(DataCenter dc)
{
dc.name = dc.name.trim();
//…
}
但我最终在所有相关的动作方法和编辑&创造行动方法。
问题1:有更好的方法来修剪字符串吗?
第二个问题,关于我正在检查的动作方法是字符串是唯一的或不是如下,通过编写服务方法: -
if (!repository.IsDataCenterUnique(dc.Name))
{
ModelState.AddModelError("Name", "Error occurred: DataCenter Name already exsists.");
}
但是,如果用户编辑对象但未更改其名称,则在编辑操作方法中使用此方法将导致错误。所以我修改了我的服务方法来传递对象id,然后我将它从比较中排除如下: -
if (!repository.IsDataCenterUnique(dc.Name,dc.ID))
{
ModelState.AddModelError("Name", "Error occurred: DataCenter Name already exsists.");
}
public bool IsDataCenterUnique(string name,int? id=0)
{
return !tms.DataCenters.Any(a => a.Name.ToUpper() == name.ToUpper() && a.ID != id);
}
问题2:有没有更好的方法来解决此问题而不是传递对象ID并将其排除?
答案 0 :(得分:3)
在字符串上放置一个扩展方法,该方法将区分不区分大小写的比较:
public static class StringExtensions {
public bool TrimAndEqualsInsensitive (this string str1, string str2) {
return str1.Trim().Equals(str2.Trim(), StringComparison.CurrentCultureIgnoreCase);
}
}
然后,您可以在要与另一个字符串进行比较的字符串上调用first.TrimAndEqualsInsensitive(second)
。
您还可以在模型中的Id字段上放置[CustomValidation(Method="ValidationMethod")]
,其中ValidationMethod
采用字符串/ ID类型,您将检查数据库以使用TrimAndEqualsInsensitive
,然后您可以检查在更新数据库之前.IsValid
。