【问题标题】:Strange behaviour in ASP.NET MVC2 views and partial formASP.NET MVC2 视图和部分表单中的奇怪行为
【发布时间】:2010-09-07 00:07:32
【问题描述】:

我正在 ASP.NET MVC 2 中实现 MS NerdDinner 应用程序,并且我使用的是谷歌地图而不是 MS 地图。我使用来自谷歌网站的示例代码来制作地图。我在同一个目录中有两个非常简单的视图,Create.aspx 和 Edit.aspx,它们分别创建和编辑晚餐。它们非常简单——它们都渲染了一个名为 Dinner.ascx 的局部视图,它也在同一个目录中。

Dinner 表单包含 3 个 js 文件,还呈现了另一个显示 google 地图的部分表单。我有两个问题:

  1. 晚餐表单在从编辑视图呈现时没有找到 Javascript 文件并且完全崩溃,而从创建视图调用它时看到的是 Javascript 文件并且正在工作到一定程度。创建的 url 是http://localhost/NerdDinner/Dinners/Create,编辑是http://localhost/NerdDinner/Dinners/Edit/39。为什么在编辑视图中找不到 JS 文件,即使两个视图都呈现相同的局部视图?

  2. 在 Firefox(版本 3.6.8)中,创建页面有时只能工作,它非常不一致。通常在刷新几次或离开并返回页面后它最终会工作,而在 IE 8 中它一直工作。为什么FF这样不一致?

解决方案目录结构为:

NerdDinner(根)
控制器
- HomeController.cs
- DinnersController.cs
- 等
型号
脚本
- CurrentJS.js
- MainJS.js
- jQuery-1.4.1.js
- 等
视图
- 帐户
- 晚餐
- - 创建.aspx
- - 编辑.aspx
- - DinnerForm.ascx
- - GoogleMap2.ascx
- - 等
- 主页
- 共享

我已经用这个头撞墙了 2 天,再也看不到树木了。下面的代码(如果有点冗长,请道歉):

创建.aspx

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<NerdDinner.Controllers.DinnerFormViewModel>" %>
<asp:Content ID="Title" ContentPlaceHolderID="TitleContent" runat="server">
    Host a Dinner
</asp:Content>
<asp:Content ID="Create" ContentPlaceHolderID="MainContent" runat="server">
    <h2>Host a Dinner</h2>
    <% Html.RenderPartial("DinnerForm"); %>
</asp:Content>

编辑.aspx:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<NerdDinner.Controllers.DinnerFormViewModel>" %>
<asp:Content ID="Title" ContentPlaceHolderID="TitleContent" runat="server">
    Edit:
    <%=Html.Encode(Model.Dinner.Title) %>
</asp:Content>
<asp:Content ID="Edit" ContentPlaceHolderID="MainContent" runat="server">
    <h2>
        Edit Dinner</h2>
    <% Html.RenderPartial("DinnerForm"); %>   
</asp:Content>

DinnerForm.ascx:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<NerdDinner.Controllers.DinnerFormViewModel>" %>
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
<script type="text/javascript" src="../Scripts/MainJS.js"></script>
<script type="text/javascript" src="../Scripts/CurrentJS.js"></script>
<script type="text/javascript">
    $(document).ready(function() {
        $("#Address").blur(function(evt) {
            $("#Latitude").val("");
            $("#Longitude").val("");

            var address = jQuery.trim($("#Address").val());

            alert('address: ' + address);

            if (address.length < 1)
                return;

            codeAddress();
        });
    });
</script>

<%= Html.ValidationSummary("Please correct your errors and try again.") %>
<% using (Html.BeginForm()) { %>
<fieldset>
    <p>
        <label for="Title">
            Dinner Title:</label>
        <%= Html.TextBox("Title", Model.Dinner.Title) %>
        <%=Html.ValidationMessage("Title", "*") %>
    </p>
    <p>
        <label for="EventDate">
            Event Date:</label>
        <%= Html.TextBox("EventDate", Model.Dinner.EventDate) %>
        <%= Html.ValidationMessage("EventDate", "*") %>
    </p>
    <p>
        <label for="Description">
            Description:</label>
        <%= Html.TextArea("Description", Model.Dinner.Description) %>
        <%= Html.ValidationMessage("Description", "*") %>
    </p>
    <p>
        <label for="Address">
            Address:</label>
        <%= Html.TextBox("Address", Model.Dinner.Address) %>
        <%= Html.ValidationMessage("Address", "*") %>
    </p>
    <p>
        <label for="Country">
            Country:</label>
        <%= Html.DropDownList("Country", Model.Countries) %>
        <%= Html.ValidationMessage("Country", "*") %>
    </p>
    <p>
        <label for="ContactPhone">
            Contact Phone #:</label>
        <%= Html.TextBox("ContactPhone", Model.Dinner.ContactPhone) %>
        <%= Html.ValidationMessage("ContactPhone", "*") %>
    </p>
    <p>
        <%= Html.Hidden("Latitude", Model.Dinner.Latitude) %>
    </p>
    <p>
        <%= Html.Hidden("Longitude", Model.Dinner.Longitude) %>
    </p>
    <p>
        <input type="submit" value="Save" />
    </p>
</fieldset>
<div id="mapDiv">
    <%Html.RenderPartial("GoogleMap2", Model.Dinner); %>
</div>
<% } %>

GoogleMap2.ascx:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>    
<style type="text/css">
  html { height: 100% }
  body { height: 100%; margin: 0px; padding: 0px }
  #map_canvas { height: 50% }
  #infoPanel {
    float: left;
    margin-left: 10px;
  }
  #infoPanel div {
    margin-bottom: 5px;
  }
</style>
<!-- End add for google map -->

<div id="map_canvas" style="width: 765px; height: 400px;">
</div>

<div id="infoPanel">
    <b>Marker status:</b>
    <div id="markerStatus">
        <i>Click and drag the marker.</i></div>
    <b>Current position:</b>
    <div id="info"></div>
    <b>Closest matching address:</b>
    <div id="address"></div>
</div>

<script type="text/javascript">
    $(document).ready(function() {
        initialize4();
    });
</script>

CurrentJS.js:

//// +++++++++++ Start of attempt to pinpoint location automatically

function initialize4() {
    var myOptions = {
        zoom: 9,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    };

    map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);

    // Try W3C Geolocation (Preferred)     
    if (navigator.geolocation) {
        browserSupportFlag = true;
        navigator.geolocation.getCurrentPosition(function(position) {
            initialLocation = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);
            map.setCenter(initialLocation);
        }, function() {
            handleNoGeolocation(browserSupportFlag);
        });
        // Browser doesn't support Geolocation
    } else {
        browserSupportFlag = false;
        handleNoGeolocation(browserSupportFlag);
    }

    if (initialLocation == 'undefined')
        alert('1' + initialLocation);
    else
        alert('2' + initialLocation);

    //Add draggable marker
    var marker = new google.maps.Marker({
        position: initialLocation, //latLng,
        title: 'Point B',
        map: map,
        draggable: true
    });

    // Update current position info.
    updateMarkerPosition(initialLocation);
    geocodePosition(initialLocation);

    // Add dragging event listeners.
    google.maps.event.addListener(marker, 'dragstart', function() {
        updateMarkerAddress('Dragging...');
    });

    google.maps.event.addListener(marker, 'drag', function() {
        updateMarkerStatus('Dragging...');
        updateMarkerPosition(marker.getPosition());
    });

    google.maps.event.addListener(marker, 'dragend', function() {
        updateMarkerStatus('Drag ended');
        geocodePosition(marker.getPosition());
    });

    function handleNoGeolocation(errorFlag) {
        if (errorFlag == true) {
            alert("Geolocation service failed.");
            initialLocation = newyork;
        } else {
            alert("Your browser doesn't support geolocation. We've placed you in newyork.");
            initialLocation = newyork;
        }
        map.setCenter(initialLocation);
    }
}

function geocodePosition(pos) {
    geocoder.geocode({
        latLng: pos
    }, function(responses) {
        if (responses && responses.length > 0) {
            updateMarkerAddress(responses[0].formatted_address);
        } else {
            updateMarkerAddress('Cannot determine address at this location.');
        }
    });
}

function updateMarkerStatus(str) {
    document.getElementById('markerStatus').innerHTML = str;
}

function updateMarkerPosition(latLng) {
    //alert('latLng:' + latLng);
    document.getElementById('info').innerHTML = [
    latLng.lat(),
    latLng.lng()
  ].join(', ');
}

function updateMarkerAddress(str) {
    document.getElementById('address').innerHTML = str;
}

function codeAddress() {
    var address = document.getElementById("address").value;

    alert('In codeAddress');

    geocoder.geocode({ 'address': address }, function(results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            map.setCenter(results[0].geometry.location);
            var marker = new google.maps.Marker({
                map: map,
                position: results[0].geometry.location
            });
        } else {
            alert("Geocode was not successful for the following reason: " + status);
        }
    });
}
//// +++++++++++++ End attempt to pinpoint location automatically    

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-2


    【解决方案1】:

    我通过从相对路径更改为使用以下语法来修复 js 问题:

    <script src='<%=ResolveClientUrl("~/Scripts/MainJS.js") %>' type="text/javascript"></script>
    

    【讨论】:

      【解决方案2】:

      Q1:听起来好像对在哪里可以找到 javascript 文件感到困惑。

      而不是

      <script type="text/javascript" src="../Scripts/MainJS.js"></script>
      <script type="text/javascript" src="../Scripts/CurrentJS.js"></script>
      

      把这些改成

      <script type="text/javascript" src="/Scripts/MainJS.js"></script>
      <script type="text/javascript" src="/Scripts/CurrentJS.js"></script>
      

      根据当前正在渲染的视图或局部视图,这些行上的相对路径可能会有所不同。

      Q2:在 Firefox(3.6.8 版)中,“创建”页面有时会起作用 - 您能否进一步解释一下 - 当它不起作用时会显示什么?

      【讨论】:

      • 嗨,蒂姆 - 对于第一季度,您能否重写您所写的内容......似乎缺少一些文字。对于 Q2,Firefox 经常不会在网页上显示地图,只是一个空的 div 区域。我打电话给 navigator.geolocation.getCurrentPosition whick 应该返回带有纬度和经度位置的数据。只要地图不显示,这就是未定义的。在 IE 中它总是返回 2 个值。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多