如何在剃刀内逃脱弦?

时间:2012-07-02 18:04:13

标签: javascript razor escaping

我有一个使用foreach填充的列表框。 (很好地解释了为什么我需要这样做。) 我需要转义字符串,因为fname和lname可以包含特殊字符,例如'或'。

foreach (var cust in item.Customers)
{
    var custString = string.Format("{0}%#%{1}%#%{2}", cust.CustID, cust.LName, cust.FName);

    <option value="@custString">@cust.DisplayName</option>
}

有没有办法在设置值后立即对custString进行javascript转义?或者有一个首选的C#转义方式,可以很好地使用javascript的unescape,我正在使用它来浏览这些字符。

1 个答案:

答案 0 :(得分:3)

这就是AttributeEncode助手的作用:

<option value="@Html.AttributeEncode(custString)">@cust.DisplayName</option>
但是,嘿,你在做什么? foreach循环生成下拉列表????

尝试使用Html.DropDownListFor帮助程序,并在太迟之前停止查看。这个助手就像它的名字所暗示的那样。并负责编码和转义等等。

所以只需定义一个视图模型:

public class MyViewModel
{
    public string CustomerId { get; set; }
    public IEnumerable<SelectListItem> Customers { get; set; }
}

然后继续执行控制器操作并将此视图模型传递给视图:

public ActionResult Index()
{
    IEnumerable<Customer> customers = ... fetch the domain model from your DAL or something
    // map to a view model:
    var viewModel = new MyViewModel
    {
        Customers = customers.Select(x => new SelectListItem
        {
            Value = x.CustID,
            Text = string.Format("{0}%#%{1}%#%{2}", x.CustID, x.LName, x.FName)
        })
    };

    // pass the view model to the view:
    return View(viewModel);
}

并在视图内部,当您需要生成下拉列表时使用DropDownListFor帮助程序:

@Html.DropDownListFor(x => x.CustomerId, Model.Customers)