在Razor

时间:2015-07-16 11:41:47

标签: c# asp.net razor selectlist

我的数据库包含两个表,一个包含我的类型,另一个包含用于UI的主表,其中一些数据包含my类型的myid列。

   myTable
**myid   myname**
1    firstname
2    x-name
99   randomename
 ....

mastertable used in view

id  onecol  twocol refcol <- col is refering mytable
1     xyz    abc   2        <-value 2 is myid of mytable   

.... 鉴于此,我需要显示所有myName而不是Id,但使用id更新主表。所以我设置如下: -

我在asp.net中的控制器设置了一些SelectList并传递给ViewBag,如​​

ViewBag.myType = new SelectList(tableList, "myId", "myName");

在我使用的视图中

<div class="form-group">
    @Html.LabelFor(model => model.myType, new { @class = "control-label col-md-2" })
    <div class="col-md-10">            
        @Html.DropDownList("myType", ViewBag.myType as SelectList,"-Select-", new { @class = "form-control" })
        @Html.ValidationMessageFor(model => model.myType)
    </div>

上面运行良好,但在控制器中我没有得到myId,并且在我在浏览器中查看之前未定义,然后传递给控制器​​。如下。我试过了。

在脚本中传递我使用过的控制器

$(".form-group").each(function () {
    if ($(this).find('select').length > 0) {
       attrName = $(this).find('select').attr("name");
        if (attrName == "myType") {       
              //the below is returning undefined 
// the value are undefined for all items as look into chrome debug tool for the list
              //        paramList[attrName] = $(this).find('select').val(); 

//so i used the below that is returning correct text selected
                    var myName = $("#myType option:selected").text();
                    //i need somehwat below, whihc is not correct syntactically
                    var myVal = @{ ((IEnumerable<SelectListItem>)ViewBag.myType).Where(x => x.Value == @:myVal).First();}                        
                    //need to pass value, but is 0 in controller.
                    paramList[attrName] = myVal; 
                }

1 个答案:

答案 0 :(得分:1)

这不是你问题的答案,但我必须指出这是一个错误:

var myVal = @{ ((IEnumerable<SelectListItem>)ViewBag.myType).Where(x => x.Value == @:myVal).First();}

此代码是Razor和JavaScript混合在一起。

请注意,这是错误的:

JavaScript是一种客户端编程语言,而Razor是服务器端。

当用户访问您的页面时,您的服务器(IIS)将根据您编码的Razor生成一个HTML页面返回给客户端。

所以当在客户端调用/执行此函数时:

$(".form-group").each(function () {

无法执行此行:

var myVal = @{ ((IEnumerable<SelectListItem>)ViewBag.myType).Where(x => x.Value == @:myVal).First();}

如果要在客户端上访问此ViewBag.myType,可以将其转换为JSON:

注意:以下代码尚未经过测试

<script>

var list = @Html.Raw(Json.Encode((IEnumerable<SelectListItem>)ViewBag.myType))

$(".form-group").each(function () {
.....
// Other Code
var myName = $("#myType option:selected").text();

for(var i = 0; i < list.length; i++){   

if(list[i].Text == myName ){


alert('Match Found');

}

}
</script>

摘要:您无法在客户端上使用JavaScript执行Razor代码。

<强>解答:

您应该做的是将列表发布到ViewBag

中的视图

控制器:

ViewBag.MydropDown = tableList;

查看:

    @{
        var items = (IEnumerable<myTable>)ViewBag.MydropDown; 
     }

// Note make sure that Property Names are correct in below line  

    @Html.DropDownListFor(m => m.myType, new SelectList(items, "myId","myName"), "--Select--", new{@class = "form-control"})