【问题标题】:Populating dropdownlist with selectlist in ViewData在 ViewData 中使用选择列表填充下拉列表
【发布时间】:2009-03-04 02:37:58
【问题描述】:

我正在尝试填充 HTML。带有 selectlist 的下拉列表,其中填充了来自数据库调用的字符串值(位置地址)和文本(位置描述)字段。我将选择列表作为视图数据传递给我的视图。下拉列表填充得很好,但是当我使用该值时,它是 null 或空,正如我在我的 javascript 函数中放置的警报所看到的那样。这是代码任何想法为什么this.locations.value 为空:

我的查看代码:

<script type="text/javascript">
    var map;
    var gdir;
    var geocoder = null;
    var addressMarker;

    function setDirections(fromAddress, toAddress, locale) {
        alert(toAddress);
        gdir.load("from: " + fromAddress + " to: " + toAddress, { "locale": locale });
    }
</script>

<div id="maincontent2">
    <form action="#" onsubmit="setDirections(this.from.value, this.locations.value, 'en_US'); return false">
        <table>
            <tr>
                <th align="left">From:&nbsp;</th>
                <td align="left" ><input type="text" id="fromAddress" name="from" size="35px" value="King of Prussia, PA"/></td>
                <th align="left">&nbsp;&nbsp;To:&nbsp;</th>
                <td align="left"> <%= Html.DropDownList("locations",(SelectList)ViewData["OfficeLocations"])%></td>
            </tr>
            <tr>
                <td></td>
                <td align="left">
                    <br />
                    <input name="submit" type="submit" value="Get Directions!" />
                </td>
            </tr>
        </table>
        <table>
            <tr>
                <td valign="top"><div id="drv_directions" style="width: 250px"></div></td>
                <td valign="top" style="padding-top:15px"><div id ="map_canvas"></div></td>
            </tr>
        </table>      
     </form>
</div>

我的控制器代码:

public ActionResult Directions()
{
    uls_dbDataContext ulsdb_dc = new uls_dbDataContext();
    ViewData["OfficeLocations"] = new SelectList(ulsdb_dc.GetOfficeLocations(),"location_address", "location_name");
    ViewData["Title"] = "Directions";

    return View();
}

【问题讨论】:

    标签: javascript model-view-controller drop-down-menu viewdata selectlist


    【解决方案1】:

    Locations 是一个选择,没有 value 属性。要获取所选选项的值,您需要使用所选索引,找到正确的选项,并引用选项的值。但是,如果您使用 jQuery,则可以使用 jQuery 对象的 val() 方法获取 select 的值。我建议使用 jQuery,因为它会使代码更简单,并且 MS 将通过 Visual Studio 支持它。

    使用 jQuery 的示例:

    <script type='text/javascript'>
        $(document).ready( function() {
           $('form').submit( function() {
              var fromAddress = $(this).find('#from').val();
              var toAddress = $(this).find('#locations').val();
              var locale = 'en-US';
    
              ....
              return false;
           });
        });
    </script>
    
      <form action="#">
    
        <table>
        <tr><th align="left">From: </th>
    
        <td align="left" ><input type="text" id="fromAddress" name="from" size="35px"
        value="King of Prussia, PA"/></td>
        <th align="left">  To: </th>
        <td align="left"> <%= Html.DropDownList("locations",(SelectList)ViewData["OfficeLocations"])%></td>
    
        ...
    

    【讨论】:

    • 还是不行。从我的表单标签中取出 onsubmit 。我已经在使用 jquery,但将您的建议添加到我的就绪函数中。警报为 fromAddress 生成“未定义”,为 to Address 生成空白。
    【解决方案2】:

    下面是现在工作的代码:

    <script type="text/javascript">
    
        var map;
        var gdir;
        var geocoder = null;
        var addressMarker;
    
        function setDirections(fromAddress, toAddress, locale) {
    
            gdir.load("from: " + fromAddress + " to: " + toAddress,
            { "locale": locale });
        }
    
        $(document).ready(function() {
            if (GBrowserIsCompatible()) {
                map = new GMap2(document.getElementById("map_canvas"));
                gdir = new GDirections(map, document.getElementById("drv_directions"));
                GEvent.addListener(gdir, "load", onGDirectionsLoad);
                GEvent.addListener(gdir, "error", handleErrors);
    
                setDirections("King of Prussia", "1302 Conshohocken Road, Conshohocken, PA 19428", "en_US");
            }
            $('form').submit(function() {
                var fromAddress = $(this).find('#from').val();
                var toAddress = $(this).find('#locations').val();
                var locale = 'en-US';
                alert(fromAddress);
                alert(toAddress);
                setDirections(fromAddress, toAddress, locale);
                return false;
            });
    
        });
    
    </script>
    

    【讨论】:

    • 我知道这是不久前的事了,但您可能想解释一下发生了什么变化,这样人们就不必“盯着和比较”来弄清楚了。
    • 您的权利已经有一段时间了,但我相信不同之处在于我引用下拉列表的方式。来自:this.location.value 至:$(this).find('#from').val();
    • 我的意思是 $(this).find('#location').val();
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多