Razor视图引擎中存在这三个不同的特征,可用于实现类似的结果.最后,它们中的所有三个都只是呈现HTML代码片段,但定义和使用它们的方式却截然不同.我知道:
Html Helpers被创建为HtmlHelper类的扩展方法.他们经常使用TagBuilder该类生成一些HTML,并且总是应该返回一个IHtmlString.
Razor Helpers(@helper方法)可以在本地(在同一个剃刀文件中)或全局(在App_Code目录中)定义.它们是HTML代码的小片段,可以在Razor文件中专门重用.
最后,部分视图只是常规视图文件,可以使用@Html.Partial帮助程序包含在其他视图文件中.
我的问题是:
这些功能中是否有特定的方案?或者归结为不同的口味以达到相同的效果?
我做的是这样的:
SqlParameter param = new SqlParameter("@Param", 0) { SqlDbType = SqlDbType.Int };
private void TestParam(SqlParameter param) {
string test = param.Value.ToString(); // Getting NullReferenceException here
}
Run Code Online (Sandbox Code Playgroud)
但是,当我这样说时,我停止获取异常:
SqlParameter param = new SqlParameter("@Param", SqlDbType.Int) { Value = 0 };
private void TestParam(SqlParameter param) {
string test = param.Value.ToString(); // Everything OK
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以告诉我为什么SqlParameter假设0与null相同?
编辑: MSDN在此解释:SqlParameter构造函数
有没有办法创建一个使用new()构造函数约束来要求具有特定类型构造函数的类的泛型方法?
例如:
我有以下代码:
public T MyGenericMethod<T>(MyClass c) where T : class
{
if (typeof(T).GetConstructor(new Type[] { typeof(MyClass) }) == null)
{
throw new ArgumentException("Invalid class supplied");
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
是否有可能有这样的东西?
public T MyGenericMethod<T>(MyClass c) where T : new(MyClass)
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
(我是.Net和微软世界的新手,来自Java和Tomcat背景,所以请记住这一点.)
我正在使用Visual Studio 2013,C#,.Net 4.5,MVC 5和EF 6开发我的第一个.Net应用程序.这是一个相当简单的基于Web的应用程序,使用Windows身份验证和Active Directory组授权公平地执行SQL Server数据库中表的基本CRUD操作.
我还没有部署应用程序.我还在开发它并在我的PC上运行(运行Windows 7).当我按下Ctrl-F5在Internet Explorer或Google Chrome中测试应用程序时,一切正常.
但是,如果我告诉Visual Studio在Firefox中访问它,它会显示没有任何CSS或JavaScript 的页面.我可以单击应用程序中的链接并导航到各个页面,这些页面都可以正常工作.它们只显示没有任何CSS或工作JavaScript.当我手动尝试查看其中一个CSS或JavaScript文件时,我收到内部服务器错误(HTTP错误500).检查日志文件会显示页面尝试加载的每个CSS和JavaScript文件的状态代码500.
我很神秘,因为它可以从Internet Explorer和Chrome中正常工作.如何使用不同的Web浏览器导致此内部服务器错误?
我发布了一些代码,但此时我不知道有什么用处.(我可以显示IIS Express正在记录哪些附加信息,如果有的话,但我不知道在哪里可以找到它,除了显示状态代码500的行.)
在开发的早期阶段,我意识到当我希望它被命名为"Version"(大写)时,我已经命名了一些数据库字段"version".我在该字符串的整个解决方案中进行了全局查找/替换,而不是对该字段进行重命名.可能有一些重要的事情被这个过程所困扰,但我已经对"版本"(以及"版本")进行了全局查找,并且没有找到任何值得注意的内容.
如果我绝对必须,我可能只是从头开始重新创建项目,并希望我不会将同样的问题(或新问题)复制/粘贴到新项目中,但我希望有人能来有一些比较容易尝试的东西.
这是Views/Shared/_Layout.cshtml的开头:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>@ViewBag.Title - Experiment 626</title>
@Styles.Render("~/Content/css")
@Scripts.Render("~/bundles/modernizr")
</head>
Run Code Online (Sandbox Code Playgroud)
这是App_Start\BundleConfig.cs:
using System.Web;
using System.Web.Optimization;
namespace Experiment626
{
public class BundleConfig
{
// For more information on bundling, visit http://go.microsoft.com/fwlink/?LinkId=301862
public static void RegisterBundles(BundleCollection bundles)
{
bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
"~/Scripts/jquery-{version}.js"));
bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include(
"~/Scripts/jquery.validate.min.js",
"~/Scripts/jquery.validate.unobtrusive.min.js"));
// Use the …Run Code Online (Sandbox Code Playgroud) 我目前正在使用ASP.NET MVC 4路由LowercaseUrls选项设置为true,它工作得很好.我正在使用此配置:
routes.LowercaseUrls = true;
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new {
controller = "Inicio",
action = "Index",
id = UrlParameter.Optional
});
Run Code Online (Sandbox Code Playgroud)
但是在一组特定的操作中,我有一个id加密且区分大小写的字符串参数.
然后,当我尝试生成这样的动作链接时:
@Html.ActionLink("My Text", "Action", "Controller", new { id = encryptedString })
Run Code Online (Sandbox Code Playgroud)
idURL中的参数将转换为小写,从而在尝试解密字符串时导致错误.
是否可以将路由配置为忽略URL参数的小写URL?
我需要使用Xamarin.iOS为演示创建一个简单的登录表单(用户名/密码),但我不想在此时深入了解XCode.
也许类似于您在其他.NET技术中可以做的事情:
var panel = new Panel();
panel.Controls.Add(new Label("Username"));
panel.Controls.Add(new TextBox("Password"));
Run Code Online (Sandbox Code Playgroud)
有没有办法以编程方式在Xamarin for iOS中创建简单的界面?或者只需要使用XCode设计接口?
我有一个包含多个Web服务的Web服务项目.其中两个Web服务共享一个在BL类中定义的枚举,如下所示:
public class HumanResourcesService
{
public SomeLibrary.Employee GetEmployee(int employeeCode)
{
var employee = new SomeLibrary.Employee();
employee.Type= SomeLibrary.EmployeeType.SomeType;
return employee ;
}
}
public class BankService
{
public bool ProcessPayment(int employeeCode, EmployeeType employeeType)
{
bool processed = false;
// Boring code
return processed;
}
}
Run Code Online (Sandbox Code Playgroud)
这只是一个例子.
这两个Web服务在Web项目中引用时会生成不同的EmployeeType枚举代理,因此我需要显式转换以调用以下ProcessPayment方法BankService:
public void SomeMethod(int employeeCode)
{
var hrService = new HumanResourcesService();
var employee = hrService.GetEmployee(employeeCode);
var bankService = new BankService();
bankService.ProcessPayment(employee.Code, (MyProject.BankService.EmployeeType) employee.Type);
}
Run Code Online (Sandbox Code Playgroud)
我理解.NET必须这样做才能创建WSDL,但我不能以某种方式使两个服务在代理类上引用相同的枚举而不破坏任何东西?
我正在使用Visual Studio 2013和IIS Express 8为本地Intranet开发应用程序.此应用程序是在Visual Studio 2012中使用ASP.NET MVC 4构建的,后来迁移到了2013.我一直在使用Visual Studio Development Server,直到我迁移到VS2013没有任何问题.
迁移后,应用程序编译,运行和验证正常,但它不提供静态文件 - 它只返回一个HTTP 500没有进一步细节的响应.见下图:

这也发生在Images和CSS文件中.
我可以检查什么来解决这个问题?有什么建议?
更新:
更新2:
有任何想法吗?
在一个应用程序中,我需要.NET基于其运行时类型而不是其编译时类型来调用方法.
简化示例:
class A { }
class B : A { }
static void Main(string[] args)
{
A b = new B();
Print(b);
}
static void Print(A a)
{
Console.WriteLine("Called from A");
}
static void Print(B b)
{
Console.WriteLine("Called from B");
}
Run Code Online (Sandbox Code Playgroud)
上面的代码实际上会打印Called from A,但我需要它Called from B.
这按预期工作:
static void Print(A a)
{
var b = a as B;
if (b != null)
return Print(b);
else
Console.WriteLine("Called from A");
}
Run Code Online (Sandbox Code Playgroud)
但出于可维护性的考虑,这是不可取的.
我相信这个问题与此类似:为什么不根据对象的运行时类型选择此方法?,但对于.NET而不是Java.
我想从WebMethod返回一个ExpandoObject,如下所示:
[WebMethod]
public ExpandoObject TestMethod(int val)
{
dynamic item = new ExpandoObject();
item.Value = val;
item.SomeOtherStuff = "SomeOtherStuff";
DynamicallyAddMoreFields(item);
return item;
}
Run Code Online (Sandbox Code Playgroud)
当我尝试这样做时,我收到此错误:
要成为XML可序列化,从IEnumerable继承的类型必须具有Add(System.Object)的实现
我无法扩展ExpandoObject类,因为它是密封的.
是否有可能以其他方式做到这一点?
我有一个与此类似的jQuery/HTML代码:
<form action="/SomeAction" method="post">
<input id="my-textbox" type="text" placeholder="Write something and press enter to continue..." />
</form>
<script type="text/javascript">
$(function() {
$('#my-textbox').keyup(function(e) {
var $textbox = $(this);
if ($textbox.val().length > 0 && e.keyCode == 13) {
$textbox.parent('form').submit();
}
});
});
</script>
Run Code Online (Sandbox Code Playgroud)
目的是在用户按下"Enter"键时自动提交表单.我经常使用Firefox,所以在我使用谷歌浏览器和Internet Explorer进行测试之前,一切都还可以.
当我在后面的浏览器中按下Enter键时,有时我会提交两次表单.这很容易被注意到,因为我会在我的数据库中获得重复的条目,并且我会看到两个POST使用Fiddler.
经过一些测试,我发现我的问题是jQuery代码,因为文本框会在没有它的情况下自动提交,并且POST在某些浏览器中使用此代码会产生第二个代码.
我的问题是:
为什么浏览器不能巧妙地阻止第二个表单发布(就像Firefox在我的测试中所做的那样)?
我是否应该在所有平台的所有主流浏览器中都期待此行为?
有没有办法改进这个代码所以我使用JavaScript执行提交,但是没有提交两次提交的表单?
javascript forms jquery javascript-events double-submit-problem
.net ×5
c# ×5
asp.net-mvc ×3
firefox ×2
iis ×2
jquery ×2
static-files ×2
web-services ×2
.net-3.5 ×1
asmx ×1
asp.net ×1
dynamic ×1
forms ×1
generics ×1
iis-express ×1
javascript ×1
polymorphism ×1
razor ×1
sqlparameter ×1
xamarin ×1
xamarin.ios ×1