我想创建一个类似于UrlHelper类的辅助类,因为它需要对视图可用的类的实例化,但我不能在我的生活中解决UrlHelper实例化的问题在@Url视图中可用,因为我想做同样的事情。
任何人都可以启发我吗?
答案 0 :(得分:4)
我以前从未这样做过,但这是你可以尝试的。
尝试创建一个扩展System.Web.Mvc.ViewPage的新类。我在这台机器上没有MVC源代码,所以我不能确切地说框架是如何为视图创建这个实例的,但是你可以在Web.config中更改基页类型以使MVC创建新类型的实例,而不是自己的类型。
然后,您可以将所需的任何属性添加到该新类型中,并在视图中访问它们。
您还必须为该类型创建一个通用:Your.New.Page.Type<T>
,并将其声明为视图中的类型(我不确定如何在Razor中完成此操作):
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="Youre.New.Page.Type" %>
可能有一堆我不知道的东西。
请参阅pageBaseType
属性:
<configuration>
<system.web>
<pages
validateRequest="false"
pageParserFilterType="System.Web.Mvc.ViewTypeParserFilter, System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
pageBaseType="Your.New.Page.Type, Your.New"
userControlBaseType="System.Web.Mvc.ViewUserControl, System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
</pages>
</system.web>
</configuration>
答案 1 :(得分:3)
Controller的UrlHelper在MVC框架中设置。向视图中可用的控制器添加另一个对象级属性需要破解框架(如果我错了,请告诉我)。
通常,最好创建一个在视图中返回所需对象的扩展方法。例如:
public static class UrlHelperExtensions
{
public static MyObjectType GetMyObject(this UrlHelper urlHelper)
{
return new MyObjectType();
}
}
要像GetMyObject()
这样使用@Url.GetMyObject()
,您需要在Web.config中包含声明扩展方法的命名空间:
<namespaces>
<!-- other namespaces will be here -->
<add namespace="My.Namespace" />
</namespaces>
<强>更新强> 在回复您的评论时,请考虑向您的模型添加非特定于视图的功能:
@Model.MyObject.GetSomeProperty()
答案 2 :(得分:1)
像这样创建你的助手:
public static class Extensions
{
public static string SomeUrl(this UrlHelper urlHelper)
{
return "someUrl";
}
}
在您看来,您可以像这样引用它:
@Url.SomeUrl()
如果它们位于不同的名称空间中,则需要将其放在视图的顶部:
@using YourContainingExtNameSpace
修改强>:
如果您不想扩展UrlHelper
类,可以创建一个单独的类:
public class UrlGenerator
{
public string MakeUrl()
{
return "someUrl";
}
}
只要您在View中有此引用,就可以像这样调用此方法:
@{
UrlGenerator ug = new UrlGenerator();
ug.MakeUrl();
}
答案 3 :(得分:0)
我唯一能想到的是在UrlHelper上创建扩展并在那里实现您的需求。
public static class UrlExtensions
{
public static string CustomThingy(this UrlHelper urlHelper)
{
//Do your custom stuff in here and add extra parameters if you need them
//For example some Func or Expression or more simpler a string
}
}
但问题仍然是你想用它做什么,因为在某些情况下,编写AjaxExtension或HtmlExtension会更容易。这就是我对你的问题进行初步评论的原因。所有这些都为您提供了不同的概念。
public static class HtmlExtensions
{
public static string CustomThingy(this HtmlHelper urlHelper)
{
}
}
public static class AjaxExtensions
{
public static string CustomThingy(this AjaxHelper urlHelper)
{
}
}