首先,我要说明我知道在我的视图中访问服务器端控件在MVC中是不受欢迎的.但是,我需要在我的情况下(据我所知).这是我的故事.:)
我有一个第三方控件,我在我的Web应用程序中使用.我目前被赋予了将WebForms解决方案移植到MVC的任务.这个特定的第三方Web控件需要WebForms体系结构,因此我希望只使用WebForms项目中的相同代码.
我最初的方法是拥有两个网站(一个WebForms网站和一个MVC网站),然后使用来自MVC端的iFrame链接这两个网站.虽然我知道这会起作用,但使用这个特殊控件只是有点过分.经过更多的研究,我发现我可以"混合男孩们"并在MVC项目中使用WebForms架构.因此,我采用的新方法是仅将使用此第三方控件的页面复制到特定目录(即'View\SomeDir\WebForms'),然后忽略我的global.asax文件中的该目录,以便MVC路由系统没有拿起它:
routes.IgnoreRoute("View\SomeDir\WebForms\{*pathInfo}");
Run Code Online (Sandbox Code Playgroud)
不幸的是,当我将ASPX页面复制到我的MVC项目时,我发现CodeBehind不允许我访问我在页面上的控件.以下是设置方式:
<%@ Register
Assembly="..."
Namespace="..."
TagPrefix="custom" %>
<custom:SomeControl ID="customControl" runat="server" />
Run Code Online (Sandbox Code Playgroud)
这是我的代码背后的样子:
public class MyPage : Page
{
protected void Page_Load(object sender, EventArgs args)
{
Debug.WriteLine(customControl.ID); // <-- COMPILE ERROR: Cannot resolve symbol 'customControl'
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是我的项目甚至不会编译,因为我在CodeBehind的每个控件上都出现了这个错误.将其他控件(即标签,面板,文本框等)转换为客户端标签不是问题,但我需要在我的代码中访问此自定义控件,以便我可以收听它(服务器端) )事件并作出相应的反应; 基本的WebForms东西......
我正在努力做甚么可能吗?我想到的另一种方法might是初始化并捕获控制器类中的服务器端事件.但是,我想避免在视图中序列化控件的状态,只是将其传递给控制器并尽可能返回?
提前感谢任何建议!
首先,我是MVC的新手,所以请原谅这个问题是否基本.
我正在使用自定义路由创建以下URL(http:// mysite/subscriber/12345),其中12345是订户号.我希望它ShowAll在Subscriber控制器中运行动作.我的路由是使用Phil的路由调试器触发,当我传入上面的url时,路由调试器将ID显示为12345.我的控制器正在接受一个int为subscriberID.当它触发时,控制器抛出错误
参数字典包含非可空类型"System.Int32"的参数"id"的空条目.
为什么路由调试器显示一个值而控制器没有看到它?
这是我的路线(第一个是罪魁祸首)
routes.MapRoute(
"SubscriberAll",
"subscriber/{id}",
new { controller = "Subscriber", action = "ShowAll", id=0 },
new { id = @"\d+" } //confirm numeric
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
Run Code Online (Sandbox Code Playgroud)
知道我为什么在ShowAll行动中得到空?这是动作方法签名:
public ActionResult ShowAll(int id)
Run Code Online (Sandbox Code Playgroud) 我有一个控制器将逻辑,寻找:会话值
//checks value null etc.. for existing record in session memory.
Session["certnum"]
Run Code Online (Sandbox Code Playgroud)
然后在控制器中我决定有一个条件:
//is called to initiate a New Record that will be created.
Session.Abandon();
Run Code Online (Sandbox Code Playgroud)
但是在程序编码中是Session.Abandon(); 在创建TempData ["myobject"] ="foo"之前,在单步执行代码时,立即窗口中的TempData显示我的值,一切看起来都很好.然后重定向到另一个控制器:
return RedirectToAction("ChildInfo", "NewRecord");
Run Code Online (Sandbox Code Playgroud)
此ChildInfo方法不再具有TempData值...现在它为null.在设置TempData值之前调用了Session Abandon方法,不确定这是否是MVC Sessions的错误,但这对我来说毫无意义.如果我正在创建一个新的轻量级会话TempData,那么它应该持久保存到下一个控制器.如果我删除Session.Abandon()方法,那么TempData值将保持原样,就像之前一样.
也许我不能正确理解MVC区域是如何工作的,但这让我有些困惑.
所以此时如果你启动应用程序并导航到/ MyArea /它应该加载AnArea控制器及其匹配视图.如果导航到/ MyArea/AnArea,它将显示相同的结果.
但是,如果您导航到/ AnArea /,仍然会找到控制器并显示以下错误消息:
The view 'Index' or its master was not found or no view engine supports the searched locations. The following locations were searched:
~/Views/anarea/Index.aspx
~/Views/anarea/Index.ascx
~/Views/Shared/Index.aspx
~/Views/Shared/Index.ascx
~/Views/anarea/Index.cshtml
~/Views/anarea/Index.vbhtml
~/Views/Shared/Index.cshtml
~/Views/Shared/Index.vbhtml
Run Code Online (Sandbox Code Playgroud)
这是正确的行为吗?我原以为一个区域的控制器只能通过它自己的区域访问而不是全局访问.
我刚刚在我的网站主机上部署了一个MVC4 .NET 4.0应用程序,用于"实时"部署测试.非区域路线工作正常,例如我的
@Html.ActionLink("Register as a Client", "Register", "Account", new { registrationType = "Client"}, null)
Run Code Online (Sandbox Code Playgroud)
链接工作正常,链接打开正确的页面.但是,通过指向基于区域的操作的链接,如下所示:
@Html.ActionLink("Authors", "Index", "Home", new { Area = "Author", registrationType = "Author" }, null)
Run Code Online (Sandbox Code Playgroud)
实际呈现给浏览器的链接缺少动作和控制器,即
http://mylivedomain.com/?Area=Author®istrationType=Author
Run Code Online (Sandbox Code Playgroud)
值得注意的是,MVC4的css捆绑功能在部署后无法正常工作,我回过头来使用经典样式链接到各个样式表.
可能相关:我的问题:为什么我的MVC4应用程序中未经修改的模板代码尝试两次注册区域?
JUST IN:从区域路由映射中删除默认路由的默认操作解决了这个问题.在VS2012模板代码中没有默认控制器.
asp.net-mvc asp.net-mvc-routing asp.net-mvc-areas asp.net-mvc-4
我有一个具有"一般"路径结构的站点,以及一个额外的"翻译"区域.所以在顶层,你有类似的东西:
在Translate区域内,我有:
所有这些工作.
但是,只要我在现有结构中添加另一个控制器,例如.定义......
或发音......
我得到的只是404.
我所在地区的路由配置如下:
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"Translate_direct",
"Translate/{controller}/{action}",
new { action = "Index", controller = "Default", }
);
context.MapRoute(
"Translate_default",
"Translate/{toLanguageCode}/{query}/{fromLanguageCode}/{controller}/{section}/{action}/{id}",
new { action = "Index", controller="Default", id = UrlParameter.Optional, section=UrlParameter.Optional }
);
}
Run Code Online (Sandbox Code Playgroud)
我安装了Phil Haack的RouteDebugger并得到了以下结果:

因此它似乎与Controller和Action相匹配,但我得到的是404.
为了完整性和保证,还显示了我的"MVC"文件结构:

我显然错过了一些显而易见的东西,但不确定是什么......?
更新:
似乎我的命名空间以某种方式涉及.
我的TranslateAreaRegistration类的命名空间为Taggloo.Web.Client.Areas.Translate,但我的PronunciationController的命名空间为*Taggloo.Web.**Mvc.**Client.Areas.Translate.Controllers*
似乎我的命名空间中的错误导致两者不同(TranslateAreRegistration类也应该在Taggloo.Web.Mvc.Client.Areas.Translate命名空间中)是问题.我尝试将它们都制作成Taggloo.Web.Mvc ....但这不起作用.我不情愿地将它们都设置为Taggloo.Web.Client ......而现在它可以工作了.
所以不是一个解决方案,一个解决方法,尽管环顾四周,我仍然没有明白为什么.
如何在包含区域的ASP.NET MVC应用程序中将视图设置为域的主页.我需要一个特定区域的视图作为主页.怎么可以这样做?
我尝试使用以下代码但没有成功.
public static void RegisterRoutes(RouteCollection routes) {
routes.MapRoute(
name: "Home",
url: "",
defaults: new { controller = "Home", action = "Index" },
namespaces: new string[] { "WebApp.Areas.UI.Controllers" }
);
}
Run Code Online (Sandbox Code Playgroud) 我目前正在开发一个asp.net mvc 4应用程序,我需要以下类型的URL:
需要路由的网址
我遇到的问题是当前{username}被视为一个动作,所以为了解决这个问题我实现了以下路由,但这意味着每次我想实现一个新动作,或者有一个需要的控制器{username},我必须更新我的路线:
仅显示Foo路线
routes.MapRoute("FooSomeAction", "foo/someaction", new { controller = "Food", action = "SomeAction" });
routes.MapRoute("FooDelete", "foo/delete/{id}", new { controller = "Food", action = "Delete" });
routes.MapRoute(
"FooProfile",
"foo/{username}",
new { controller = "Foo", action = "Index", username = "" }
);
// Default route
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
Run Code Online (Sandbox Code Playgroud)
2个问题
1)有没有办法在没有硬编码所有路由的情况下实现上述网址?
2)处理某人使用恰好与控制器或操作名称相同的用户名的情况的最佳方法是什么?
DotnetShadow
因此,我们有一个MVC项目,该项目已通过不同版本的MVC从1升级到4。
现在我们有一个控制器方法:
public async Task<ActionResult> IndexAsync()
Run Code Online (Sandbox Code Playgroud)
因此,如果我们转到http://somedomain.xyz/WhicheverController 或 http://somedomain.xyz/WhicheverController/Index,则会收到404。
http://somedomain.xyz/WhicheverController/IndexAsync 路由到该方法就好了。
我们的路线出了什么问题?
我们已经实现了ASP.NET MVC网站的本地化版本,其网址结构如下:
网址:// {语言} - {文化}/{控制器}/{行动}/{ID}
通过这种方式,我们可以按语言生成URL,这些URL由Google bot正确抓取:
翻译在两个地方实现.首先,我们使用以下方法修改了MVC的默认路由:
routes.MapRoute(
name: "Default",
url: "{language}-{culture}/{controller}/{action}/{id}",
defaults: new
{
controller = "Home",
action = "Index",
id = UrlParameter.Optional,
language = "en",
culture = "US"
}
);
Run Code Online (Sandbox Code Playgroud)
然后我们创建了一个动作过滤器,它切换到URL中可用的当前语言,如果不可用于默认值:
public class LocalizationAttribute : ActionFilterAttribute
{ public override void OnActionExecuting(ActionExecutingContext filterContext)
{
string language = (string)filterContext.RouteData.Values["language"] ?? "en";
string culture = (string)filterContext.RouteData.Values["culture"] ?? "US";
Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo(string.Format("{0}-{1}", language, culture));
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(string.Format("{0}-{1}", language, culture));
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果用户输入http:// …