我创建了一个创建Html元素4次和
的方法public IHtmlString customHtml(string htmlCode){
for(int i = 0; i<4 i++){
htmlCode += htmlCode;
}
return new HtmlString(htmlCode);
}
当调用此方法4次时,int someNumber
与字符串连接,我希望它增加1-4
int someNumber = 1;
@customHtml("<div>"+(someNumber++)+"<div>")
结果Html为:
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
相反,我得到了这个:
<div>1</div>
<div>1</div>
<div>1</div>
<div>1</div>
元素不会总是<div>
,并且数字并不总是通过字符串传递,而int可以从任何数字开始而不仅仅是1
答案 0 :(得分:3)
您需要将htmlCode作为模板传递,稍后将进行格式化:
您的剃刀语法变为:
@customHtml("<div>{0}<div>")
你的方法看起来像这样:
public IHtmlString customHtml(string htmlCode){
var sb = new StringBuilder();
for(int i = 1; i<=4; i++){
sb.AppendFormat(htmlCode, i);
}
return new HtmlString(sb.ToString());
}
原始尝试不起作用的原因是您将字符串传递给方法。你没有传递表达方式。这意味着您将精确的字符串"<div>1</div>"
传递给您的方法,然后您的方法只将该字符串写出四次。
<强>附录:强>
现在,如果你真的想像你的例子一样构建它,你可以这样做:
public IHtmlString customHtml(Func<string> s) {
var sb = new StringBuilder();
for(int i = 1; i<=4; i++){
sb.Append(s());
}
return new HtmlString(sb.ToString());
}
然后,您的Razor语法如下所示:
int someNumber = 1;
@customHtml(() => "<div>" + someNumber++ + "</div>").Dump();
这些解决方案中的任何一个都能为您提供相同的结果:<div>1</div><div>2</div><div>3</div><div>4</div>
答案 1 :(得分:1)
只需从方法中删除参数,并在生成html标记时使用您正在迭代的变量。
var htmlCode = new StringBuilder();
for (int i = 0; i < 4; i++)
{
htmlCode.AppendFormat("<div>{0}</div>", i);
}
return new HtmlString(htmlCode.ToString());
如果确实需要将html传递给此方法,可能是因为您“重复”的标记发生了变化,那么我们需要对其进行修改。
答案 2 :(得分:0)
尝试替换......
int someNumber = 1;
@customHtml("<div>"+(someNumber++)+"<div>")
与
int someNumber = 0;
@customHtml("<div>"+(++someNumber)+"<div>");
奇怪的是,当出现增量/减量问题时,这对我来说无数次。
答案 3 :(得分:0)
为什么不直接发送两个参数?
public IHtmlString customHtml(string htmlCode, int someNumber){
var sb = new StringBuilder();
for(int i = someNumber; I < someNumber + 4; i++){
sb.AppendFormat(htmlCode, i);
}
return new HtmlString(sb.ToString());
}
你这样称呼它:
@customHtml("<div>{0}<div>", someNumber)