0

我有一个使用 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 配合使用,我正在使用它来对这些字符进行转义。

4

1 回答 1

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)
于 2012-07-02T18:18:27.297 回答