【问题标题】:how to store values in tempdata mvc4?如何在 tempdata mvc4 中存储值?
【发布时间】:2013-09-06 20:18:22
【问题描述】:

我正在尝试将 json 位置值存储在 tempdata 中,我正在使用 json api 获取用户当前位置,并且我想根据位置向用户显示内容,但我无法这样做我正在分享我的代码,请大家帮帮我

<script type="text/javascript">

        var strip, strcountry, strcity, strregion, strlatitude, strlongitude, strtimezone

        function GetUserInfo(data) {

            strip = data.host; strcountry = data.countryName; strcity = data.city;

            strregion = data.region; strlatitude = data.latitude; strlongitude = data.longitude;

            strtimezone = data.timezone;

        }

        $(function () {

            BindUserInfo();

        })

        function BindUserInfo() {

            //document.getElementById('lblCity').innerText = strcity;
            $('#term').attr("placeholder", strcity);
            $('#term').attr("value", strcity);



        }

    </script>
    <script type="text/javascript" src="http://smart-ip.net/geoip-json?callback=GetUserInfo"></script>

现在我想从这里获取位置并在 linq 查询中应用,我正在使用 MVC 4 (Razor) 请帮我解决这个问题。

【问题讨论】:

  • 你想在服务器端代码的什么时候使用这个值?它应该在以后的页面加载中使用吗?或者您是否需要立即在服务器端对其进行处理?前者将涉及以某种方式将其发布到服务器(这完全取决于此页面是/做什么),后者将涉及对运行服务器端代码并​​返回 JSON 数据的新操作方法进行 AJAX 调用。跨度>
  • @David 我在餐厅控制器的索引操作中使用这个值,我想根据用户当前位置显示餐厅列表,如果你仍然不明白我的意思,那么我可以共享服务器端代码也是如此..但请帮帮我
  • 那么,这段 JavaScript 代码在哪里运行,与您需要在哪里使用该值有关?也就是说,在这段 JavaScript 代码运行之后,是什么将用户带到了餐厅控制器的 index 动作中?
  • @David 当用户点击餐厅链接时,页面将根据用户当前位置显示餐厅列表,如果有其他方法可以做到这一点,我会很高兴
  • @David 我需要在我的餐厅控制器中使用这个值

标签: jquery asp.net-mvc linq asp.net-mvc-4 razor


【解决方案1】:

根据上面的 cmets,听起来这一系列事件正在发生:

  1. 用户所在的页面包含此 JavaScript 代码
  2. 用户单击该页面上的链接以转到另一个页面
  3. 其他页面需要根据此 JavaScript 代码中的值显示数据

如果这是正确的,那么您有许多可用的选项。需要明确的是,所讨论的价值是什么? strcity?:

$('#term').attr("placeholder", strcity);
$('#term').attr("value", strcity);

如果是这样,那么当您在此处设置该值时,您还可能将其设置在查询字符串上,以便链接到下一页。像这样的:

$('#someLink').src = '@Url.Action("Index", "Restaurants")?city=' + strcity;

这将混合使用预运行的服务器端代码作为链接的根,而客户端代码则仅将一个值附加到它上面。然后控制器方法简单地接受city作为参数:

public ActionResult Index(string city)
{
    // get your list of restaurants and return the view
}

这里不需要TempData,您只是将值直接发送到控制器操作。

如果出于某种原因您不想像那样修改src,您也许可以改为通过链接调用的表单发送值。因此,对于餐厅控制器上的索引操作,您可能会有这样的事情,而不是 ActionLink

@using(Html.BeginForm("Index", "Restaurants", FormMethod.Get))
{
    <a id="restaurantsLink" href="javascript:void(0);">Go to restaurants</a>
    <input type="hidden" name="city" />
}

以及稍后的 JavaScript 代码:

$('#restaurantsLink').click(function () {
    $('form').submit();
});

您可能需要在 jQuery 选择器中更唯一地标识该表单,尤其是当该页面上存在(或可能存在)其他表单时。然后在您的原始 JavaScript 代码中,您只需在隐藏输入中设置值:

$('input[name=city]').val(strcity);

在第二种情况下,控制器操作仍与第一种相同,接受 city 字符串参数。

【讨论】:

  • 我已按照您的方法进行操作,但此处出现错误“ var model = db.Restaurant.Where(x => x.RestaurantId != null).Where(x => x.Locations.Select (c => c.City == city)) // 这里是错误“
  • 错误在此段“.Where(x => x.Locations.Select(c => c.City == city))”错误是“无法隐式转换类型 system.collection .generic.ienumerable to bool"
  • @user2755609:那么您的 LINQ 语句中的逻辑不正确。这与问题无关,但似乎正在发生的事情是您正在选择要在 Where 子句中使用的 bool 值列表,该子句需要 bool 值(不是它们的列表)。我主要是在猜测,因为我不知道您的数据,但听起来您可能想要类似的东西:.Where(x =&gt; x.Locations.Any(c =&gt; c.City == city)) 这将导致 booltrue 如果 any这些位置与城市匹配,如果没有一个匹配,则false
  • 谢谢它的工作,但我试过这个“ $('#link').src = '@Url.Action(actionName: "Index", controllerName: "Restaurant")?city=' + strcity; " 并且得到了这个不工作的链接 "localhost:1985/Restaurant?Length=10"
  • @user2755609:"Length=10" 是从哪里来的?在视图中,它看起来像 ? 和它后面的字符是服务器端代码的一部分吗?如果是这样,请尝试:$('#link').src = '@Url.Action(actionName: "Index", controllerName: "Restaurant")' + '?city=' + strcity; 这会将客户端内容与服务器端代码分开一点。
猜你喜欢
  • 2012-07-25
  • 2013-02-06
  • 1970-01-01
  • 2013-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多