任何人都可以解释虚拟路径的计算方式吗? 根据RouteData.Values或根据url模式?
我正在尝试删除一些routedata值,但虚拟路径仍然没有变化。 我有一个问题,虚拟路径在URL的开头返回冗余斜杠,如:/ he / controller / action文化之前的斜杠是多余的......
我正在使用以下
之类的自定义路线 routes.Add("Default",
new CustomRoute("{culture}/{controller}/{action}/{id}",
new
{
controller = "Desktop",
action = "Index",
culture = "he-IL",
guid = "",
id = UrlParameter.Optional
}));
routes.Add("Wizard_" + wizard,
new CustomRoute("{guid}/{culture}/" + wizardName + "/{action}/{id}",
new
{
controller = wizard,
action = "Index",
culture = "he-IL",
guid = "",
id = UrlParameter.Optional
}));
问题是当使用Url.Action(action,controller)方法并且操作在向导控制器中时,操作的URL是向导格式,如{guid} / {culture} /“+ wizard +”/ {动作} / {ID} 如果guid值为空,则返回的URL为// he-il / controller / action 而不是/ he-il / controller / action
CustomRoute类:
public class CustomRoute : Route
{
private List<string> _wizards;
public CustomRoute(string uri, object defaults)
: base(uri, new RouteValueDictionary(defaults), new MvcRouteHandler())
{
_wizards = new List<string>();
FillWizards(ref _wizards);
DataTokens = new RouteValueDictionary();
}
public override RouteData GetRouteData(HttpContextBase httpContext)
{
bool hasGuid = httpContext.Request.RequestContext.RouteData != null
&& httpContext.Request.RequestContext.RouteData.Values != null
&& httpContext.Request.RequestContext.RouteData.Values.ContainsKey("guid")
&& !httpContext.Request.RequestContext.RouteData.Values["guid"].ToString().Equals(Guid.Empty);
var routeData = base.GetRouteData(httpContext);
if (routeData == null)
return null;
bool isWizard = _wizards.Contains(routeData.Values["controller"].ToString());
Debug.WriteLine("Controller: " + routeData.Values["controller"] + " action: " + routeData.Values["action"] + " Is wizard: " + isWizard + " has guid: " + hasGuid);
if (isWizard && !hasGuid)
{
if (string.IsNullOrEmpty(routeData.Values["guid"].ToString()))
{
routeData.Values["guid"] = Guid.NewGuid().ToString("N");
}
}
return routeData;
}
public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
{
VirtualPathData path;
path = base.GetVirtualPath(requestContext, values);
return path;
}
private void FillWizards(ref List<string> items)
{
var _configuration = ObjectFactory.GetInstance<IConfiguration>();
List<string> wizards = _configuration.GetParamValue<string>("SessionUniqueWizards", "").Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries).ToList();
items = wizards;
}
}
答案 0 :(得分:0)
缺少guid
参数的原因是
guid
的调用中没有Url.Action(action, controller)
参数。guid
参数。也就是说,正在被击中的当前路线没有guid
路线值。guid
(guid = ""
)的默认值。由于空字符串是您指定为默认字符串的字符串,因此默认情况下为空字符串。要正确构建网址,guid
必须来自某个地方。构建外发网址时MVC always passes matching route values from the current request,但由于并非所有网址都有guid
,您需要为上下文中不存在的网页指定网址:
Url.Action("Index", "Search", new { guid = "a565f84f9152495792d433f5bd26000f")
这是正常的做法。通常,如果要构建CRUD操作的链接,则需要在实体列表中进行。
例如,对于Product
实体,您通常会为列表中的每个Edit Product
添加Delete Product
和Product
的链接,如下所示:< / p>
<tr>
<td>model.ProductName</td>
<td>@Html.ActionLink("Product", "Edit", new { guid = model.ProductId })</td>
<td>@Html.ActionLink("Product", "Delete", new { guid = model.ProductId })</td>
</tr>
通常还会有一个链接来添加一个没有标识符的新实体。
@Html.ActionLink("Product", "Add")
但是从你的例子中不清楚一个&#34;向导&#34;将被创建。创建新标识符通常应该是Add
方法的函数,而不是路由的函数。
但似乎存在一个问题,即您在路由中随机生成GUID,因此不清楚您希望如何将此值从一个请求维护到下一个请求。