C# 混合敲除变量和剃刀变量

C# 混合敲除变量和剃刀变量,c#,asp.net-mvc,razor,knockout.js,C#,Asp.net Mvc,Razor,Knockout.js,我正在努力解决我想象中的一个非常愚蠢的问题。我正在使用“foreach”遍历Knockout.JS中的一个集合,需要使用集合中的变量为每个项创建一个链接 问题是,我的url是使用视图模型中的变量动态生成的,我需要将这些变量与Knockout集合中的变量结合起来 这是我的区块包含淘汰循环 <div data-bind="foreach: pagedList" class="span8" style="border-bottom: 1px solid #0094ff;">

我正在努力解决我想象中的一个非常愚蠢的问题。我正在使用“foreach”遍历Knockout.JS中的一个集合,需要使用集合中的变量为每个项创建一个链接

问题是,我的url是使用视图模型中的变量动态生成的,我需要将这些变量与Knockout集合中的变量结合起来

这是我的区块包含淘汰循环

    <div data-bind="foreach: pagedList" class="span8" style="border-bottom: 1px solid #0094ff;">
        <div style="cursor: pointer;">                 

            <p data-bind="text: hotelId"></p>
            <p data-bind="text: name"></p>
            <p data-bind="text: hotelRating"></p>
            <p data-bind="text: propertyCategory"></p>

        </div>
    </div>   

理想情况下,我希望通过'onclick=“window.location=”方法将链接添加到父div

<div style="cursor: pointer;" onclick="window.location="@Url.Action( "Index", "Hotel",                new { regionId = Model.region.regionId, regionName =     HttpUtility.UrlPathEncode(Model.region.regionNameLong.ToString().Replace(",","")).Replace("%20","-"), hotelId = " + hotelID() + ", hotelName =   HttpUtility.UrlPathEncode(Convert.ToString(" + name() +     ").Replace(",","")).Replace("%20","-") })"> </div>

在将来,如果您创建一个解决问题的JSFiddle,它将非常有帮助

你的第二种方法更接近

下面是一个使用自定义敲除绑定和模板的示例:

在将JavaScript发送到客户端之前,可以使用razor在服务器端设置值

HTML是:

<div data-bind="template: { foreach: myItems,  name: 'template-item' }" class="span8" style="border-bottom: 1px solid #0094ff;"></div> 

<!-- basic template -->
<script type="text/html" id="template-item">
            <p data-bind="text: hotelId"></p>
            <p data-bind="text: hotelName"></p>
            <p data-bind="text: hotelRating"></p>
            <p data-bind="text: propertyCategory"></p>
            <a data-bind="KoYourCustomBind: $data" href="#">link</a>
</script>

fiddle示例依赖于jQuery和Knockout。

谢谢您,它对我来说非常有效。我只需使用Razor设置“urlPart”变量,然后如图所示使用。唯一需要注意的是,我需要在自定义绑定处理程序中的每个项值上使用“ko.utils.unwrapObservable”。不确定原因,但没有它就无法工作.不客气。很高兴它对您有效,您也足够熟悉w.Knockout来展开…因为您的代码使用了实际的可观察属性,而我的简单示例没有使用。愉快的编码。
<div data-bind="template: { foreach: myItems,  name: 'template-item' }" class="span8" style="border-bottom: 1px solid #0094ff;"></div> 

<!-- basic template -->
<script type="text/html" id="template-item">
            <p data-bind="text: hotelId"></p>
            <p data-bind="text: hotelName"></p>
            <p data-bind="text: hotelRating"></p>
            <p data-bind="text: propertyCategory"></p>
            <a data-bind="KoYourCustomBind: $data" href="#">link</a>
</script>
// sample viewModel
var testViewModel = function(){
    var self = this;   
    // another viewmodel property you want to use in url creation. 
    this.urlPart = "/ALLUSE/";
    // array or list is called myItems
    var iData = [new myItem("999", "Sheraton", "CAT7"), new myItem("007", "Marriott", "CAT11"), new myItem("212", "Budget Inn", "CAT00")]; 
    this.myItems = ko.observableArray(iData);

}

var myItem = function(sHotelId, sName, sPropertyCategory) {
    var self = this;
    this.hotelId = sHotelId;
    this.hotelName =  sName;
    this.hotelRating = 4; //hardcoded. only 4 star hotels here :) 
    this.propertyCategory = sPropertyCategory;
};

// ko bindings
ko.bindingHandlers.KoYourCustomBind = {
    init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext)
    {
        var item = valueAccessor();
        var url = 'http://' + bindingContext.$parent.urlPart + item.hotelId + item.propertyCategory;
        $(element).text(item.hotelName);
        $(element).attr('href', url);
    }   
};

var vm = new testViewModel();
ko.applyBindings(vm);