如何更改ViewModel中字符串属性的值



我想在视图中显示一些文本,但如果文本长度超过600个字符,我想截断并在末尾添加省略号。如果文本少于600个字符,我将显示未修改的整个字符串。

我在想这样的事情:

public string Description 
{
get 
{
int txtLen = Description?.Length ?? 0;
int maxLen = 600;
if (txtLen > 0)
{
string ellipsis = txtLen > maxLen ? "…" : "";
return Description.Substring(0, txtLen > maxLen ? maxLen : txtLen) + ellipsis;
}
else
{ 
return "";
}
}
set 
{
Description = value;
}
}

上面的代码可以编译,但当我尝试运行它时,我的应用程序超时,并显示"连接被拒绝"错误消息。如果我将属性更改为仅public string Description { get; set; },我的应用程序就会运行。

我需要setter,因为在我的应用程序的其他地方,我会修改控制器中的Description属性。

更新

感谢Steve的解决方案。然而,当截断确实起作用时,我意识到有时我真的想把整个文本都放在视图中。所以我做了一个额外的方法,用原来的Description代替private string _dsc:

public string Description { get; set; }
public string DescriptionTruncate(int maxLen)
{
int txtLen = Description?.Length ?? 0;
if (txtLen > 0)
{
string ellipsis = txtLen > maxLen ? "…" : "";
return Description.Substring(0, txtLen > maxLen ? maxLen : txtLen) + ellipsis;
}
else
{
return "";
}
}

get访问器中的代码将引发堆栈溢出异常,因为为了测量描述的长度,您调用了get访问器,并且在堆栈溢出停止代码之前,这种情况永远不会结束。

要解决您的问题,请使用后端变量并使用它

private string _dsc = "";
public string Description
{
get
{
int txtLen = _dsc.Length;
int maxLen = 600;
if (txtLen > 0)
{
string ellipsis = txtLen > maxLen ? "..." : "";
return _dsc.Substring(0, txtLen > maxLen ? maxLen : txtLen) + ellipsis;
}
else
{
return "";
}
}
set
{
_dsc = value;
}
}

您不想在使用css的视图中这样做吗?

https://developer.mozilla.org/en-US/docs/Web/CSS/text-overflow

对我来说,这比在你的视图模型中做更干净。

相关内容

  • 没有找到相关文章

最新更新