【问题标题】:Good use of Attribute to Determine correct method to call善用属性来确定正确的调用方法
【发布时间】:2010-12-03 16:49:36
【问题描述】:

我有两个使用相同动作名称调用的动作方法,但是,取决于实际参数类型,取决于应该调用哪个方法。这会导致歧义。我创建了一个属性来确定参数是否是 Guid 并且是适当的方法。

[RequiredGuidParameter(ParameterName = "title")]
[ActionName("Title")]
public ActionResult Item_ById(Guid id)
{ ... }

[ActionName("Title")]
public ActionResult Item_ByName(string id)
{ ... }

属性如下所示:

    public string ParameterName = string.Empty;

    public override bool IsValidForRequest(ControllerContext controllerContext, System.Reflection.MethodInfo methodInfo)
    {
        object parameter = null;
        try
        {
            parameter = controllerContext.RouteData.GetRequiredString(ParameterName) as object;
            if (parameter != null)
            {
                Guid guid;
                return Guid.TryParse((string)parameter, out guid);
            }
        }
        catch { }

        parameter = controllerContext.RequestContext.HttpContext.Request[ParameterName] as object;
        if (parameter != null)
        {
                Guid guid;
                return Guid.TryParse((string)parameter, out guid);
        }

        return false;
    }

最终目标是,如果参数是 Guid,则运行此方法,否则继续,在这种情况下,它会找到下一个。有没有更好的方法不涉及创建额外的路线?或者也许是更好的方法?

【问题讨论】:

    标签: asp.net-mvc model-view-controller custom-attributes attr


    【解决方案1】:

    为什么不这样:

    public ActionResult Item_Search(string id, Guid guid)
    {
        if( string.IsNullOrWhiteSpace(id) 
             SearchById();
         if( guid != new Guid() )
             SearchByGuid()
    }
    

    不保修的伪代码/\

    【讨论】:

    • 然后我必须有预期的路线或查询字符串。指向此操作方法的链接可以是标题(字符串)或 id(guid)。我可以检查字符串是否为 Guid 并执行 if/then 语句,但我希望在此之前将关注点分开。
    • @Tony Basallo - 您可以将这些路由参数设为可选,这样 ?Id=asd 或 ?guid=longguidstring 始终有效。
    • 这是一个选项,所以我们称之为答案。
    猜你喜欢
    • 2013-12-05
    • 2011-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    • 2022-06-18
    • 1970-01-01
    相关资源
    最近更新 更多