您描述的工作流程看起来不错。对我来说,使用一些 ID 来获取有关某些用户的更多信息似乎是安全的,特别是如果这应该是一个 API,至少,Facebook API 使用这样的原则,而不是害怕一些黑客:)
我主要关心的是当你尝试混合代码和视图时的编码风格不好。如果您确实需要在客户端和服务器端之间共享一些信息,那么我会选择这些选项之一。
选项 #1 - Cookies
What is the difference between a Session and a Cookie?
您可以在 cookie 中保存一些简单的信息并通过这种方式获取:
- 客户端:$.cookie('ID')
- 服务器:Response.Cookies["ID"]
在这种情况下,无需使用 C# 代码将您的客户端 JS 弄得一团糟,cookie 将保存在用户 PC 上,这意味着除了他之外没有人会看到它们。
选项 #2 - 模板
- 服务器:将所有需要的信息放入隐藏形式或 ViewState
- 客户端:使用 HTML 选择器从隐藏表单中获取信息
直接回答:
一般来说,如果您只担心安全问题,那么可以使用此代码,它不会破坏您网站的安全性。
虽然,我个人不喜欢这种方法,因为:
- 您将混合代码和视图,创建 MVC 来拆分它们
- 不清楚在您的视图中您将把这段代码放在哪里,因此不清楚您将如何检查该变量是否已初始化
- 您可能会在其中放置一些会破坏 JS 语法并导致 JS 错误的值
在我个人看来,我会用上述选项之一替换它。
选项 1 - MVC + JQuery + Cookie 示例
public ActionResult Index()
{
string demo = Request.QueryString["MyNameSpace.ID"]; // get value from client
Response.Cookies["MyNameSpace.ID"].Value = "server"; // change value in response
return View();
}
然后在你的 JS 文件中:
$(document).ready(function() { // make sure server rendered page
var ID = $.cookie('MyNameSpace.ID'); // get cookie value from server
$.cookie('MyNameSpace.ID', 'client'); // update, on the next request server will get it
});
选项 2 - MVC + JQuery + 模板示例
public class OptionsModel // View Model
{
public string ID { get; set; }
public string User { get; set; }
}
public ActionResult Index() // Controller
{
OptionsModel options = new OptionsModel();
options.ID = "server";
return View(options);
}
你的看法:
<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<OptionsModel>" %>
<%=Html.HiddenFor(m => Model.ID, new { @class = "MyNameSpace:ID" })%>
<%=Html.HiddenFor(m => Model.User, new { @class = "MyNameSpace:User" })%>
然后在你的 JS 文件中:
$(document).ready(function() { // make sure server rendered page
var options = $('[class^=MyNameSpace]') // get values from hidden fields
options[0] = 'client'; // update data
$.ajax({ data : options }); // create handler to send data back to server
});
Web 表单的示例没有显着差异。